--- old/apps/toys/Hello/src/main/java/hello/HelloTabPane.java 2017-12-01 17:43:50.822819000 +0530 +++ new/apps/toys/Hello/src/main/java/hello/HelloTabPane.java 2017-12-01 17:43:50.582819000 +0530 @@ -1,5 +1,5 @@ /* - * 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 @@ -28,30 +28,39 @@ 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; @@ -61,6 +70,7 @@ private Tab emptyTab; private Tab internalTab; private Tab multipleTabs; + private Tab tabForDragPolicy; private ContextMenu menu; private boolean showScrollArrows = false; @@ -78,6 +88,7 @@ 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); @@ -306,6 +317,11 @@ 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()); @@ -350,6 +366,293 @@ 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) 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();