< prev index next >

apps/toys/Hello/src/main/java/hello/HelloTabPane.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -26,43 +26,53 @@
 package hello;
 
 import javafx.application.Application;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
+import javafx.collections.ListChangeListener;
 import javafx.event.ActionEvent;
 import javafx.event.Event;
 import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.geometry.NodeOrientation;
 import javafx.geometry.Side;
 import javafx.scene.Group;
 import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.control.ContextMenu;
+import javafx.scene.control.Label;
 import javafx.scene.control.MenuItem;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
+import javafx.scene.control.TextArea;
+import javafx.scene.control.TextField;
 import javafx.scene.control.ToggleButton;
 import javafx.scene.control.ToggleGroup;
 import javafx.scene.control.Tooltip;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
+import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.FlowPane;
 import javafx.scene.layout.Region;
 import javafx.scene.layout.StackPane;
+import javafx.scene.layout.HBox;
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Rectangle;
 import javafx.stage.Stage;
 
+
 public class HelloTabPane extends Application {
 
     private TabPane tabPane;
     private Tab tab1;
     private Tab tab2;
     private Tab tab3;
     private Tab emptyTab;
     private Tab internalTab;
     private Tab multipleTabs;
+    private Tab tabForDragPolicy;
     private ContextMenu menu;
 
     private boolean showScrollArrows = false;
     private boolean showTabMenu = false;
 

@@ -76,10 +86,11 @@
         tab2 = new Tab();
         tab3 = new Tab();
         emptyTab = new Tab();
         internalTab = new Tab();
         multipleTabs = new Tab();
+        tabForDragPolicy = new Tab();
         setUpPopupMenu();
         stage.setTitle("Hello TabPane2");
         final Scene scene = new Scene(new Group(), 800, 800);
         scene.setFill(Color.GHOSTWHITE);
 

@@ -304,10 +315,15 @@
                 vbox.getChildren().add(tb);
             }
             tab3.setContent(vbox);
             tabPane.getTabs().add(tab3);
         }
+        {
+            tabForDragPolicy.setText("TabDragPolicy");
+            tabForDragPolicy.setContent(setupDragPolicyTab());
+            tabPane.getTabs().add(tabForDragPolicy);
+        }
 
         emptyTab.setText("Empty Tab");
         emptyTab.setContent(new Region());
         tabPane.getTabs().add(emptyTab);
 

@@ -348,10 +364,297 @@
         ((Group)scene.getRoot()).getChildren().add(tabPane);
         stage.setScene(scene);
         stage.show();
     }
 
+    private VBox setupDragPolicyTab() {
+        Label indexErr = new Label("");
+        Label angleErr = new Label("");
+        VBox mainContent = new VBox();
+        mainContent.setSpacing(20);
+        mainContent.setMinSize(1000, 400);
+
+        TabPane tabPane = new TabPane();
+        tabPane.setMinSize(500, 400);
+        tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS);
+        HBox tabs = new HBox();
+        tabs.getChildren().add(tabPane);
+        mainContent.getChildren().add(tabs);
+
+        for (int i = 0; i < 7; ++i) {
+            String text = i + "    ";
+            HBox hb = new HBox();
+            Tab tab = new Tab(text);
+            TextArea ta = new TextArea("" + i + i + i + i);
+            ta.setStyle("-fx-max-width: 300; -fx-max-height: 100;");
+            hb.getChildren().add(ta);
+            tab.setContent(hb);
+            tabPane.getTabs().add(tab);
+        }
+
+        TextArea instructions = new TextArea(
+            "**** INSTRUCTIONS ****\n\n" +
+            "1. TabDragPolicy.FIXED : Default policy.\n" +
+            "Click the FIXED button to set FIXED TabDragPolicy.\n" +
+            "The tabs remain fixed & tab headers cannot be dragged to reorder.\n\n" +
+            "2. TabDragPolicy.REORDER :\n" +
+            "Click the REORDER button to set REORDER TabDragPolicy.\n" +
+            "The tabs can be reordered with mouse press & drag action on tab header.\n\n" +
+            "3. With each of the drag policy,\n" +
+            "Choose different combinations of\n" +
+            "sides (TOP or BOTTOM or LEFT or RIGHT),\n" +
+            "node orientations, (LTR or RTL) and\n" +
+            "different rotation angle.\n\n" +
+            "4. Perform reordering and verify the correctness of the\n" +
+            "printed Current order of tabs and permuted tabs.\n" +
+            "And verify the navigation of tabs using left, right arrow keys.\n\n" +
+            "5. Additionally, also verify the outputs with ADD, REMOVE\n" +
+            "and REVERSE buttons."
+            );
+        tabs.getChildren().add(instructions);
+
+        Label permuted = new Label("Permuted tabs :  ");
+        Label outputPermutedTabs = new Label();
+        Label added = new Label("Added :  ");
+        Label outputAddedTabs = new Label();
+        Label removed = new Label("Removed :  ");
+        Label outputRemovedTabs = new Label();
+        Label getTabs = new Label("Current order of Tabs :  ");
+        Label outputListOfTabs = new Label();
+        tabPane.setOnMousePressed(event -> {
+            outputPermutedTabs.setText("");
+            outputAddedTabs.setText("");
+            outputRemovedTabs.setText("");
+            outputListOfTabs.setText("");
+            angleErr.setText("");
+            indexErr.setText("");
+        });
+        VBox notifications = new VBox();
+        notifications.setSpacing(15);
+        notifications.setStyle("-fx-border-color: black");
+        notifications.setPadding(new Insets(20));
+        HBox permut = new HBox();
+        permut.getChildren().addAll(permuted, outputPermutedTabs);
+
+        HBox adds = new HBox();
+        adds.getChildren().addAll(added, outputAddedTabs);
+
+        HBox removes = new HBox();
+        removes.getChildren().addAll(removed, outputRemovedTabs);
+
+        HBox allTabs = new HBox();
+        allTabs.getChildren().addAll(getTabs, outputListOfTabs);
+        notifications.getChildren().addAll(permut, adds, removes, allTabs);
+        mainContent.getChildren().add(notifications);
+
+        tabPane.getTabs().addListener((ListChangeListener<Tab>) c -> {
+            while (c.next()) {
+                String list = "";
+                outputPermutedTabs.setText("");
+                outputAddedTabs.setText("");
+                outputRemovedTabs.setText("");
+                for (int i = c.getFrom(); i < c.getTo(); i++) {
+                    list += tabPane.getTabs().get(i).getText() + ", ";
+                }
+
+                if (c.wasPermutated()) {
+                    outputPermutedTabs.setText(list);
+                } else if (c.wasAdded()) {
+                    outputAddedTabs.setText(list);
+                } else if (c.wasRemoved()) {
+                    list = "";
+                    for (Tab t : c.getRemoved()) {
+                        list += t.getText() + ", ";
+                    }
+                    outputRemovedTabs.setText(list);
+                }
+                list = "";
+                for (Tab t : tabPane.getTabs()) {
+                    list += t.getText() + ", ";
+                }
+                outputListOfTabs.setText(list);
+            }
+        });
+
+        HBox bottomBox = new HBox();
+        bottomBox.setSpacing(15);
+        bottomBox.setPadding(new Insets(20));
+        bottomBox.setStyle("-fx-border-color: black");
+
+        VBox addRemove = new VBox();
+        addRemove.setSpacing(5);
+        Button add = new Button("ADD");
+        Button remove = new Button("REMOVE");
+        HBox indexContainer = new HBox();
+        Label indexLabel = new Label("Index: ");
+        TextField indexTF = new TextField("0");
+        indexTF.setMaxWidth(50);
+        indexContainer.getChildren().addAll(indexLabel, indexTF);
+        addRemove.getChildren().add(new Label("Add / Remove index"));
+        addRemove.getChildren().add(indexContainer);
+        addRemove.getChildren().add(add);
+        addRemove.getChildren().add(remove);
+        addRemove.getChildren().add(indexErr);
+
+
+        add.setOnMouseClicked(event -> {
+            try {
+                int index = Integer.parseInt(indexTF.getText());
+                if (index >= 0 && index < tabPane.getTabs().size()) {
+                    tabPane.getTabs().add(index, new Tab(index + "--- "));
+                    tabPane.requestFocus();
+                }
+                indexErr.setText("");
+            } catch (Exception e) {
+                indexErr.setText("Incorrect Index");
+            }
+        });
+        remove.setOnMouseClicked(event -> {
+            try {
+                int index = Integer.parseInt(indexTF.getText());
+                if (index >= 0 && index < tabPane.getTabs().size()) {
+                    tabPane.getTabs().remove(index);
+                    tabPane.requestFocus();
+                }
+                indexErr.setText("");
+            } catch (Exception e) {
+                indexErr.setText("Incorrect Index");
+            }
+        });
+
+        bottomBox.getChildren().add(addRemove);
+
+        ToggleGroup side = new ToggleGroup();
+
+        ToggleButton top = new ToggleButton("TOP");
+        top.setSelected(true);
+        top.setUserData(Side.TOP);
+        ToggleButton bottom = new ToggleButton("BOTTOM");
+        bottom.setUserData(Side.BOTTOM);
+        ToggleButton left = new ToggleButton("LEFT");
+        left.setUserData(Side.LEFT);
+        ToggleButton right = new ToggleButton("RIGHT");
+        right.setUserData(Side.RIGHT);
+
+        top.setToggleGroup(side);
+        bottom.setToggleGroup(side);
+        left.setToggleGroup(side);
+        right.setToggleGroup(side);
+
+        side.selectedToggleProperty().addListener(observable -> {
+            if (side.getSelectedToggle() == null) {
+                tabPane.setSide(Side.TOP);
+            } else {
+                tabPane.setSide((Side) side.getSelectedToggle().getUserData());
+            }
+            tabPane.requestFocus();
+        });
+
+        VBox sides = new VBox();
+        sides.setSpacing(5);
+        sides.getChildren().add(new Label("Sides"));
+        sides.getChildren().add(top);
+        sides.getChildren().add(bottom);
+        sides.getChildren().add(left);
+        sides.getChildren().add(right);
+        bottomBox.getChildren().add(sides);
+
+        ToggleGroup dragPolicy = new ToggleGroup();
+        dragPolicy.selectedToggleProperty().addListener(observable -> {
+            if (dragPolicy.getSelectedToggle() == null) {
+                tabPane.setTabDragPolicy(TabPane.TabDragPolicy.FIXED);
+            } else {
+                tabPane.setTabDragPolicy((TabPane.TabDragPolicy) dragPolicy.getSelectedToggle().getUserData());
+            }
+            tabPane.requestFocus();
+        });
+
+        ToggleButton reorder = new ToggleButton("REORDER");
+        reorder.setUserData(TabPane.TabDragPolicy.REORDER);
+        reorder.setToggleGroup(dragPolicy);
+        ToggleButton fixed = new ToggleButton("FIXED");
+        fixed.setSelected(true);
+        fixed.setUserData(TabPane.TabDragPolicy.FIXED);
+        fixed.setToggleGroup(dragPolicy);
+
+        VBox dragPolicies = new VBox();
+        dragPolicies.setSpacing(5);
+        dragPolicies.getChildren().add(new Label("Drag Policies"));
+        dragPolicies.getChildren().add(reorder);
+        dragPolicies.getChildren().add(fixed);
+        bottomBox.getChildren().add(dragPolicies);
+
+        ToggleGroup orientation = new ToggleGroup();
+        orientation.selectedToggleProperty().addListener(observable -> {
+            if (orientation.getSelectedToggle() == null) {
+                tabPane.setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT);
+            } else {
+                tabPane.setNodeOrientation((NodeOrientation) orientation.getSelectedToggle().getUserData());
+            }
+            tabPane.requestFocus();
+        });
+
+        ToggleButton ltr = new ToggleButton("LEFT TO RIGHT");
+        ltr.setSelected(true);
+        ltr.setUserData(NodeOrientation.LEFT_TO_RIGHT);
+        ltr.setToggleGroup(orientation);
+        ToggleButton rtl = new ToggleButton("RIGHT TO LEFT");
+        rtl.setUserData(NodeOrientation.RIGHT_TO_LEFT);
+        rtl.setToggleGroup(orientation);
+        VBox orientations = new VBox();
+        orientations.setSpacing(5);
+        orientations.getChildren().add(new Label("Node Orientations"));
+        orientations.getChildren().add(ltr);
+        orientations.getChildren().add(rtl);
+        bottomBox.getChildren().add(orientations);
+
+        HBox angleContainer = new HBox();
+        Label angleLabel = new Label("Angle: ");
+        TextField angleTF = new TextField("0");
+        angleTF.setMaxWidth(50);
+        angleContainer.getChildren().addAll(angleLabel, angleTF);
+        Label rotLabel = new Label("Rotate TabPane");
+        Button rotate = new Button("ROTATE");
+        rotate.setOnMouseClicked(event -> {
+            try {
+                tabPane.setRotate(Float.parseFloat(angleTF.getText()));
+                angleErr.setText("");
+            } catch (Exception e) {
+                angleErr.setText("Incorrect Angle");
+            }
+            tabPane.requestFocus();
+        });
+        VBox rotation = new VBox();
+        rotation.setSpacing(5);
+        rotation.getChildren().addAll(rotLabel, angleContainer, rotate, angleErr);
+        bottomBox.getChildren().add(rotation);
+
+        Label reverseLabel = new Label("Reverse order of tabs");
+        Button reverse = new Button("REVERSE");
+        reverse.setOnMouseClicked(event -> {
+            tabPane.getTabs().sort((o1, o2) -> {
+                if (tabPane.getTabs().indexOf(o1) > tabPane.getTabs().indexOf(o2)) {
+                    return -1;
+                } else {
+                    return 1;
+                }
+            });
+            tabPane.requestFocus();
+        });
+        VBox revContainer = new VBox();
+        revContainer.setSpacing(5);
+        revContainer.getChildren().addAll(reverseLabel, reverse);
+        bottomBox.getChildren().add(revContainer);
+
+        bottomBox.setOnMousePressed(event -> {
+            angleErr.setText("");
+            indexErr.setText("");
+        });
+        mainContent.getChildren().add(bottomBox);
+        return mainContent;
+    }
+
     private void setupInternalTab() {
         StackPane internalTabContent = new StackPane();
 
         Rectangle r = new Rectangle(700, 500);
         r.setFill(Color.LIGHTSTEELBLUE);
< prev index next >