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 javafx.scene.control.test.ScrollPane;
  26 
  27 import javafx.event.ActionEvent;
  28 import javafx.event.EventHandler;
  29 import javafx.scene.Group;
  30 import javafx.scene.Node;
  31 import javafx.scene.Scene;
  32 import javafx.scene.control.*;
  33 import javafx.scene.control.test.utils.*;
  34 import javafx.scene.control.test.utils.ptables.PropertiesTable;
  35 import javafx.scene.control.test.utils.ptables.PropertyTablesFactory;
  36 import javafx.scene.control.test.utils.ptables.SpecialTablePropertiesProvider;
  37 import javafx.scene.layout.GridPane;
  38 import javafx.scene.layout.HBox;
  39 import javafx.scene.layout.Pane;
  40 import javafx.scene.layout.VBox;
  41 import test.javaclient.shared.InteroperabilityApp;
  42 import test.javaclient.shared.Utils;
  43 
  44 /**
  45  * @author Alexander Kirov
  46  */
  47 public class NewScrollPaneApp extends InteroperabilityApp {
  48 
  49     public final static String CHANGE_CONTENT_BUTTON_ID = "CHANGE_CONTENT_BUTTON_ID";
  50     public final static String CONTENT_BUTTON = "CONTENT_BUTTON";
  51     public final static String CUSTOM_CONTENT_ID = "CUSTOM_CONTENT_ID";
  52     public final static String CONTENT_TEXT_AREA_ID = "CONTENT_TEXT_AREA_ID";
  53     public final static String CONTENT_TEXT_FIELD_ID = "CONTENT_TEXT_FIELD_ID";
  54     public final static String DECREASE_SCALE_BUTTON_ID = "DECREASE_SCALE_BUTTON_ID";
  55     public final static String DECREASE_SCROLLPANE_SCALE_BUTTON_ID = "DECREASE_SCROLLPANE_SCALE_BUTTON_ID";
  56     public final static String INCREASE_SCALE_BUTTON_ID = "INCREASE_SCALE_BUTTON_ID";
  57     public final static String INCREASE_SCROLLPANE_SCALE_BUTTON_ID = "INCREASE_SCROLLPANE_SCALE_BUTTON_ID";
  58     public final static String RESET_BUTTON_ID = "RESET_BUTTON_ID";
  59     public final static String ROTATE_BUTTON_ID = "ROTATE_BUTTON_ID";
  60     public final static String ROTATE_SCROLLPANE_BUTTON_ID = "ROTATE_SCROLLPANE_BUTTON_ID";
  61     public final static String START_MOTION_BUTTON_ID = "START_MOTION_BUTTON_ID";
  62     public final static String TESTED_SCROLLPANE_ID = "TESTED_SCROLLPANE_ID";
  63     public final static String WITHOUT_ACTION_BUTTON = "WITHOUT_ACTION_BUTTON";
  64     public final static String CHANGE_CONTENT_TO_RESIZABLE_BUTTON_ID = "CHANGE_CONTENT_TO_RESIZABLE_BUTTON_ID";
  65     public final static String CHANGE_CONTENT_TO_CUSTOM_BUTTON_ID = "CHANGE_CONTENT_TO_CUSTOM_BUTTON_ID";
  66     public final static String ADD_SIZE_BUTTON_ID = "ADD_SIZE_BUTTON_ID";
  67     public final static String GRID_DIMENSION_TEXTFIELD_ID = "GRID_DIMENSION_TEXTFIELD_ID";
  68     public final static String ADD_GRID_BUTTON_ID = "ADD_GRID_BUTTON_ID";
  69     private static int customContentWidth = 200;
  70     private static int customContentHeight = 200;
  71     private static int scrollPaneWidth = 0;
  72     private static int scrollPaneHeight = 0;
  73 
  74     public static void main(String[] args) {
  75         try {
  76             if (args != null) {
  77                 for (int i = 0; i < args.length; ++i) {
  78                     if (args[i].equals("--customContentWidth")) {
  79                         ++i;
  80                         customContentWidth = Integer.parseInt(args[i]);
  81                     }
  82                     if (args[i].equals("--customContentHeight")) {
  83                         ++i;
  84                         customContentHeight = Integer.parseInt(args[i]);
  85                     }
  86                     if (args[i].equals("--scrollPaneWidth")) {
  87                         ++i;
  88                         scrollPaneWidth = Integer.parseInt(args[i]);
  89                     }
  90                     if (args[i].equals("--scrollPaneHeight")) {
  91                         ++i;
  92                         scrollPaneHeight = Integer.parseInt(args[i]);
  93                     }
  94                 }
  95             }
  96         } catch (NumberFormatException ex) {
  97         }
  98 
  99         Utils.launch(NewScrollPaneApp.class, args);
 100     }
 101 
 102     @Override
 103     protected Scene getScene() {
 104         Utils.setTitleToStage(stage, "ScrollPaneTestApp");
 105         return new ScrollPaneScene();
 106     }
 107 
 108     class ScrollPaneScene extends CommonPropertiesScene {
 109 
 110         private PropertiesTable tb;
 111         //ScrollPane to be tested.
 112         private ScrollPane testedScrollPane;
 113 
 114         public ScrollPaneScene() {
 115             super("ScrollPane", 800, 600);
 116         }
 117 
 118         @Override
 119         protected final void prepareScene() {
 120             Utils.addBrowser(this);
 121             testedScrollPane = new ScrollPane();
 122             testedScrollPane.setId(TESTED_SCROLLPANE_ID);
 123             final Node content = setCustomContent(customContentHeight, customContentWidth);
 124 
 125             final ContentMotion cm = new ContentMotion();
 126             testedScrollPane.setContent(content);
 127             cm.applyTransition(content);
 128 
 129             tb = new PropertiesTable(testedScrollPane);
 130             PropertyTablesFactory.explorePropertiesList(testedScrollPane, tb);
 131             SpecialTablePropertiesProvider.provideForControl(testedScrollPane, tb);
 132 
 133             if ((scrollPaneWidth > 0) && (scrollPaneHeight > 0)) {
 134                 testedScrollPane.setPrefViewportWidth(scrollPaneWidth);
 135                 testedScrollPane.setPrefViewportHeight(scrollPaneHeight);
 136             }
 137 
 138             Button changeContentButton = new Button("ChangeContent");
 139             changeContentButton.setId(CHANGE_CONTENT_BUTTON_ID);
 140             changeContentButton.setOnAction(new EventHandler<ActionEvent>() {
 141                 public void handle(ActionEvent t) {
 142                     changeContent();
 143                     cm.applyTransition(content);
 144                 }
 145             });
 146 
 147             Button addPrefWidthAndHeightButton = new Button("Add pref sizes");
 148             addPrefWidthAndHeightButton.setId(ADD_SIZE_BUTTON_ID);
 149             addPrefWidthAndHeightButton.setOnAction(new EventHandler<ActionEvent>() {
 150                 public void handle(ActionEvent t) {
 151                     tb.addDoublePropertyLine(testedScrollPane.prefWidthProperty(), -100, 200, 100);
 152                     tb.addDoublePropertyLine(testedScrollPane.prefHeightProperty(), -100, 200, 100);
 153                 }
 154             });
 155 
 156             Button setTextAreaAsContentButton = new Button("Set blue pane as content");
 157             setTextAreaAsContentButton.setId(CHANGE_CONTENT_TO_RESIZABLE_BUTTON_ID);
 158             setTextAreaAsContentButton.setOnAction(new EventHandler<ActionEvent>() {
 159                 public void handle(ActionEvent t) {
 160                     setResizableContent();
 161                     Pane pane = (Pane) testedScrollPane.getContent();
 162                     tb.addDoublePropertyLine(pane.prefWidthProperty(), 0, 300, 100);
 163                     tb.addDoublePropertyLine(pane.prefHeightProperty(), 0, 300, 100);
 164                 }
 165             });
 166 
 167             Button setCustomContentButton = new Button("Set custom content");
 168             setCustomContentButton.setId(CHANGE_CONTENT_TO_CUSTOM_BUTTON_ID);
 169             setCustomContentButton.setOnAction(new EventHandler<ActionEvent>() {
 170                 public void handle(ActionEvent t) {
 171                     setCustomContent();
 172                 }
 173             });
 174 
 175             Button buttonStart = new Button("Start motion");
 176             buttonStart.setId(START_MOTION_BUTTON_ID);
 177             buttonStart.setOnAction(new EventHandler<ActionEvent>() {
 178                 public void handle(ActionEvent t) {
 179                     cm.getTimeline().play();
 180                 }
 181             });
 182 
 183             Button rotateButton = new Button("Rotate on 30deg");
 184             rotateButton.setId(ROTATE_BUTTON_ID);
 185             rotateButton.setOnAction(new EventHandler<ActionEvent>() {
 186                 public void handle(ActionEvent t) {
 187                     content.setRotate(content.getRotate() + 30);
 188                 }
 189             });
 190 
 191             Button rotateScrollPaneButton = new Button("Rotate scrollpane on 30deg");
 192             rotateScrollPaneButton.setId(ROTATE_SCROLLPANE_BUTTON_ID);
 193             rotateScrollPaneButton.setOnAction(new EventHandler<ActionEvent>() {
 194                 public void handle(ActionEvent t) {
 195                     testedScrollPane.setRotate(testedScrollPane.getRotate() + 30);
 196                 }
 197             });
 198 
 199             Button increaseScaleButton = new Button("Increase scale");
 200             increaseScaleButton.setId(INCREASE_SCALE_BUTTON_ID);
 201             increaseScaleButton.setOnAction(new EventHandler<ActionEvent>() {
 202                 public void handle(ActionEvent t) {
 203                     content.setScaleX(content.getScaleX() + 0.15);
 204                     content.setScaleY(content.getScaleY() + 0.15);
 205                 }
 206             });
 207 
 208             Button decreaseScaleButton = new Button("Decrease scale");
 209             decreaseScaleButton.setId(DECREASE_SCALE_BUTTON_ID);
 210             decreaseScaleButton.setOnAction(new EventHandler<ActionEvent>() {
 211                 public void handle(ActionEvent t) {
 212                     content.setScaleX(content.getScaleX() - 0.15);
 213                     content.setScaleY(content.getScaleY() - 0.15);
 214                 }
 215             });
 216 
 217             Button increaseScrollPaneScaleButton = new Button("Increase ScrollPane scale");
 218             increaseScrollPaneScaleButton.setId(INCREASE_SCROLLPANE_SCALE_BUTTON_ID);
 219             increaseScrollPaneScaleButton.setOnAction(new EventHandler<ActionEvent>() {
 220                 public void handle(ActionEvent t) {
 221                     testedScrollPane.setScaleX(testedScrollPane.getScaleX() + 0.15);
 222                     testedScrollPane.setScaleY(testedScrollPane.getScaleY() + 0.15);
 223                 }
 224             });
 225 
 226             Button decreaseScrollPaneScaleButton = new Button("Decrease ScrollPane scale");
 227             decreaseScrollPaneScaleButton.setId(DECREASE_SCROLLPANE_SCALE_BUTTON_ID);
 228             decreaseScrollPaneScaleButton.setOnAction(new EventHandler<ActionEvent>() {
 229                 public void handle(ActionEvent t) {
 230                     testedScrollPane.setScaleX(testedScrollPane.getScaleX() - 0.15);
 231                     testedScrollPane.setScaleY(testedScrollPane.getScaleY() - 0.15);
 232                 }
 233             });
 234 
 235             Button resetButton = new Button("Reset");
 236             resetButton.setId(RESET_BUTTON_ID);
 237             resetButton.setOnAction(new EventHandler<ActionEvent>() {
 238                 public void handle(ActionEvent t) {
 239                     HBox hb = (HBox) getRoot();
 240                     hb.getChildren().clear();
 241                     prepareMainSceneStructure();
 242                     prepareScene();
 243                 }
 244             });
 245 
 246             setTestedControl(testedScrollPane);
 247 
 248             VBox vb = new VBox();
 249             vb.setSpacing(5);
 250             vb.getChildren().addAll(changeContentButton, setCustomContentButton, setTextAreaAsContentButton,
 251                     buttonStart, rotateButton, rotateScrollPaneButton,
 252                     increaseScrollPaneScaleButton, decreaseScrollPaneScaleButton, getAddGridPaneForm(),
 253                     increaseScaleButton, decreaseScaleButton, resetButton, addPrefWidthAndHeightButton);
 254             setControllersContent(vb);
 255 
 256             setPropertiesContent(tb);
 257         }
 258 
 259         private Node getAddGridPaneForm() {
 260             final TextField dimension = new TextField();
 261             dimension.setId(GRID_DIMENSION_TEXTFIELD_ID);
 262             dimension.setPromptText("int-dimension");
 263             dimension.setMaxWidth(50);
 264             Button addButton = new Button("Add grid");
 265             addButton.setId(ADD_GRID_BUTTON_ID);
 266             addButton.setOnAction(new EventHandler<ActionEvent>() {
 267                 public void handle(ActionEvent t) {
 268                     int c = Integer.parseInt(dimension.getText());
 269 
 270                     GridPane gridPane = new GridPane();
 271                     for (int i = 0; i < c; i++) {
 272                         for (int j = 0; j < c; j++) {
 273                             final String name = "B-" + String.valueOf(i) + "-" + String.valueOf(j);
 274                             Button temp = new Button(name);
 275                             temp.setId(name);
 276                             temp.setMinHeight(10 * i);
 277                             temp.setMinWidth(10 * j);
 278                             gridPane.add(temp, i, j);
 279                         }
 280                     }
 281                     testedScrollPane.setContent(gridPane);
 282                 }
 283             });
 284 
 285             HBox hb = new HBox(5);
 286             hb.getChildren().addAll(dimension, addButton);
 287             return hb;
 288         }
 289 
 290         private void setResizableContent() {
 291             Pane canvas = new Pane();
 292             canvas.setStyle("-fx-background-color: blue;");
 293             testedScrollPane.setContent(canvas);
 294 
 295 
 296             canvas.setPrefHeight(100);
 297             canvas.setPrefWidth(100);
 298         }
 299 
 300         private Group setCustomContent(int height, int width) {
 301             Group g = ComponentsFactory.createCustomContent(height, width);
 302             g.setId(CUSTOM_CONTENT_ID);
 303             testedScrollPane.setContent(g);
 304             return g;
 305         }
 306 
 307         private Group setCustomContent() {
 308             return setCustomContent(200, 200);
 309         }
 310 
 311         private void changeContent() {
 312             VBox vb = new VBox();
 313             Button button = new Button("Press me");
 314             button.setId(CONTENT_BUTTON);
 315             final TextField tf1 = new TextField("0");
 316             tf1.setId(CONTENT_TEXT_FIELD_ID);
 317             button.setOnAction(new EventHandler<ActionEvent>() {
 318                 public void handle(ActionEvent t) {
 319                     tf1.setText(String.valueOf(Integer.parseInt(tf1.getText()) + 1));
 320                 }
 321             });
 322             TextArea tf2 = new TextArea();
 323             tf2.setPrefHeight(100);
 324             tf2.setId(CONTENT_TEXT_AREA_ID);
 325             for (int i = 0; i < 15; i++) {
 326                 tf2.appendText("text" + i + "\n");
 327             }
 328             Button empty = new Button("This is empty-action button");
 329             empty.setId(WITHOUT_ACTION_BUTTON);
 330 
 331             vb.getChildren().addAll(button, tf1, tf2, empty);
 332             vb.setStyle("-fx-border-color: blue;");
 333 
 334             testedScrollPane.setContent(vb);
 335         }
 336     }
 337 }