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.ListView;
  26 
  27 import javafx.beans.value.ChangeListener;
  28 import javafx.beans.value.ObservableValue;
  29 import javafx.collections.FXCollections;
  30 import javafx.collections.ObservableList;
  31 import javafx.event.ActionEvent;
  32 import javafx.event.Event;
  33 import javafx.event.EventHandler;
  34 import javafx.scene.Group;
  35 import javafx.scene.Node;
  36 import javafx.scene.Scene;
  37 import javafx.scene.control.*;
  38 import javafx.scene.control.cell.ChoiceBoxListCell;
  39 import javafx.scene.control.cell.ComboBoxListCell;
  40 import javafx.scene.control.cell.TextFieldListCell;
  41 import javafx.scene.control.test.cellapps.CellCustomStringConverter;
  42 import javafx.scene.control.test.cellapps.CellsApp;
  43 import javafx.scene.control.test.utils.*;
  44 import static javafx.scene.control.test.utils.ComponentsFactory.createCustomContent;
  45 import static javafx.scene.control.test.utils.ComponentsFactory.createFormComponent;
  46 import javafx.scene.control.test.utils.ptables.NodesChoserFactory;
  47 import javafx.scene.control.test.utils.ptables.PropertiesTable;
  48 import javafx.scene.control.test.utils.ptables.PropertyTablesFactory;
  49 import javafx.scene.control.test.utils.ptables.SpecialTablePropertiesProvider;
  50 import javafx.scene.control.test.utils.ptables.StaticLogger;
  51 import javafx.scene.layout.HBox;
  52 import javafx.scene.layout.VBox;
  53 import test.javaclient.shared.InteroperabilityApp;
  54 import test.javaclient.shared.Utils;
  55 
  56 /**
  57  * @author Alexander Kirov
  58  */
  59 public class NewListViewApp extends InteroperabilityApp {
  60 
  61     public final static String ADD_ITEM_BUTTON_ID = "ADD_ITEM_BUTTON_ID";
  62     public final static String ADD_ITEM_POSITION_TEXT_FIELD_ID = "ADD_ITEM_POSITION_TEXT_FIELD_ID";
  63     public final static String ADD_ITEM_TEXT_FIELD_ID = "ADD_ITEM_TEXT_FIELD_ID";
  64     public final static String REMOVE_BUTTON_ID = "REMOVE_BUTTON_ID";
  65     public final static String REMOVE_ITEM_POS_TEXT_FIELD_ID = "REMOVE_ITEM_POS_TEXT_FIELD_ID";
  66     public final static String HARD_RESET_BUTTON_ID = "HARD_RESET_BUTTON_ID";
  67     public final static String SOFT_RESET_BUTTON_ID = "SOFT_RESET_BUTTON_ID";
  68     public final static String SCROLL_TO_BUTTON_ID = "SCROLL_TO_BUTTON_ID";
  69     public final static String SCROLL_TO_TEXT_FIELD_ID = "SCTOLL_TO_TEXT_FIELD_ID";
  70     public final static String ADD_RECTANGLE_BUTTON_ID = "ADD_RECTANGLE_BUTTON_ID";
  71     public final static String ADD_RECTANGLE_TEXT_FIELD_ID = "ADD_RECTANGLE_POSITION_TEXT_FIELD_ID";
  72     public final static String ADD_TEXT_FIELD_BUTTON_ID = "ADD_TEXT_FIELD_BUTTON_ID";
  73     public final static String ADD_TEXT_FIELD_TEXT_FIELD_ID = "ADD_TEXT_FIELD_POSITION_TEXT_FIELD_ID";
  74     public final static String TESTED_LIST_VIEW_ID = "TESTED_LIST_VIEW_ID";
  75     public final static String DECREASE_SCALE_BUTTON_ID = "DECREASE_SCALE_BUTTON_ID";
  76     public final static String DECREASE_SCALE_TEXT_FIELD_ID = "DECREASE_SCALE_TEXT_FIELD_ID";
  77     public final static String INCREASE_SCALE_BUTTON_ID = "INCREASE_SCALE_BUTTON_ID";
  78     public final static String INCREASE_SCALE_TEXT_FIELD_ID = "INCREASE_SCALE_TEXT_FIELD_ID";
  79     public final static String START_MOTION_BUTTON_ID = "START_MOTION_BUTTON_ID";
  80     public final static String START_MOTION_TEXT_FIELD_ID = "START_MOTION_TEXT_FIELD";
  81     public final static String CHANGE_SELECTION_MODEL_BUTTON_ID = "CHANGE_SELECTION_MODEL_BUTTON_ID";
  82     public final static String ADD_FORM_BUTTON_ID = "ADD_FORM_BUTTON_ID";
  83     public final static String ADD_FORM_TEXT_FIELD_ID = "ADD_FORM_TEXT_FIELD_ID";
  84     public final static String LIST_VIEW_CONTROL_ADD_INDEX_TEXT_FIELD_ID = "LIST_VIEW_CONTROL_ADD_INDEX_TEXT_FIELD_ID";
  85     public final static String LIST_FACTORY_CHOICE_ID = "LIST_FACTORY_CHOICE_ID";
  86     public static final ObservableList someValues = FXCollections.observableArrayList();
  87 
  88     public static void main(String[] args) {
  89         Utils.launch(NewListViewApp.class, args);
  90     }
  91 
  92     @Override
  93     protected Scene getScene() {
  94         Utils.setTitleToStage(stage, "ListViewTestApp");
  95         return new ListViewScene();
  96     }
  97 
  98     class ListViewScene extends CommonPropertiesScene {
  99 
 100         private PropertiesTable tb;
 101         private ListView testedControl;
 102         private ContentMotion cm;
 103         private int textFieldsCounter = 0;
 104 
 105         public ListViewScene() {
 106             super("ListView", 800, 600);
 107             someValues.addAll("Data item A", "Data item B", "Data item C");
 108             prepareScene();
 109         }
 110 
 111         @Override
 112         final protected void prepareScene() {
 113             testedControl = getNewTestedControl();
 114             tb = new PropertiesTable(testedControl);
 115             cm = new ContentMotion();
 116 
 117             final ListView testedListView = (ListView) testedControl;
 118             PropertyTablesFactory.explorePropertiesList(testedListView, tb);
 119             SpecialTablePropertiesProvider.provideForControl(testedControl, tb);
 120 
 121             final TextField tf = TextFieldBuilder.create().id(LIST_VIEW_CONTROL_ADD_INDEX_TEXT_FIELD_ID).text("0").prefWidth(40).build();
 122 
 123             HBox nodeshb = new NodesChoserFactory("Add!", new NodesChoserFactory.NodeAction<Node>() {
 124                 @Override
 125                 public void execute(Node node) {
 126                     testedControl.getItems().add(Integer.parseInt(tf.getText()), node);
 127                 }
 128             }, tf);
 129 
 130             HBox resetButtons = new HBox();
 131             Button hardResetButton = ButtonBuilder.create().id(HARD_RESET_BUTTON_ID).text("Hard reset").build();
 132             hardResetButton.setOnAction(new EventHandler<ActionEvent>() {
 133                 public void handle(ActionEvent t) {
 134                     HBox hb = (HBox) getRoot();
 135                     hb.getChildren().clear();
 136                     prepareMainSceneStructure();
 137                     prepareScene();
 138                 }
 139             });
 140 
 141             Button softResetButton = ButtonBuilder.create().id(SOFT_RESET_BUTTON_ID).text("Soft reset").build();
 142             softResetButton.setOnAction(new EventHandler<ActionEvent>() {
 143                 public void handle(ActionEvent t) {
 144                     softReset();
 145                 }
 146             });
 147             resetButtons.getChildren().addAll(hardResetButton, softResetButton);
 148 
 149             Button flushLogger = new Button("Flush logger");
 150             final CustomMultipleSelectionModel cmsm = new CustomMultipleSelectionModel(testedListView.getItems());
 151             flushLogger.setOnAction(new EventHandler<ActionEvent>() {
 152                 public void handle(ActionEvent t) {
 153                     StaticLogger.log(cmsm.getLog());
 154                 }
 155             });
 156 
 157             Button changeSelectionModel = ButtonBuilder.create().text("Change selection model to custom").id(CHANGE_SELECTION_MODEL_BUTTON_ID).build();
 158             changeSelectionModel.setOnAction(new EventHandler<ActionEvent>() {
 159                 public void handle(ActionEvent t) {
 160                     testedListView.setSelectionModel(cmsm);
 161                 }
 162             });
 163 
 164             setTestedControl(testedControl);
 165 
 166             VBox vb = new VBox();
 167             vb.setSpacing(5);
 168             vb.getChildren().addAll(resetButtons, getAddTextFieldHbox(), getAddRectangleHbox(),
 169                     getAddFormHbox(),
 170                     getAddItemHBox(), getRemoveItemHBox(), getStartMotionHBox(),
 171                     getScrollToHBox(), getDecreaseScaleHBox(), getIncreaseScaleHBox(),
 172                     changeSelectionModel, flushLogger, nodeshb, getEditFactoryComboBoxChoser());
 173             setControllersContent(vb);
 174 
 175             tb.setStyle("-fx-border-color : yellow;");
 176             setPropertiesContent(tb);
 177         }
 178 
 179         private ListView getNewTestedControl() {
 180             ListView lv = new ListView();
 181             lv.setId(TESTED_LIST_VIEW_ID);
 182             return lv;
 183             //return ListViewBuilder.create().id(TESTED_LIST_VIEW_ID).build();
 184         }
 185 
 186         private void softReset() {
 187             tb.refresh();
 188             ListView newOne = new ListView();
 189 
 190             while (testedControl.getItems().size() != 0) {
 191                 testedControl.getItems().remove(0);
 192             }
 193             testedControl.setPrefHeight(newOne.getPrefHeight());
 194             testedControl.setPrefWidth(newOne.getPrefWidth());
 195             testedControl.setOrientation(newOne.getOrientation());
 196             testedControl.setEditable(newOne.isEditable());
 197             testedControl.getSelectionModel().setSelectionMode(newOne.getSelectionModel().getSelectionMode());
 198         }
 199 
 200         private ComboBox getEditFactoryComboBoxChoser() {
 201             ComboBox<CellsApp.CellType> cb = new ComboBox<CellsApp.CellType>();
 202             cb.getItems().addAll(FXCollections.observableArrayList(CellsApp.CellType.values()));
 203             cb.setId(LIST_FACTORY_CHOICE_ID);
 204             cb.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<CellsApp.CellType>() {
 205                 public void changed(ObservableValue<? extends CellsApp.CellType> ov, CellsApp.CellType t, CellsApp.CellType t1) {
 206 
 207                     switch (t1) {
 208                         case ChoiceBox:
 209                             testedControl.setCellFactory(ChoiceBoxListCell.forListView(new CellCustomStringConverter(), someValues));
 210                             break;
 211                         case ComboBox:
 212                             testedControl.setCellFactory(ComboBoxListCell.forListView(new CellCustomStringConverter(), someValues));
 213                             break;
 214                         case TextField:
 215                             testedControl.setCellFactory(TextFieldListCell.forListView(new CellCustomStringConverter()));
 216                             break;
 217                         default:
 218                             testedControl.setCellFactory(new ListView().getCellFactory());
 219                     }
 220                 }
 221             });
 222             return cb;
 223         }
 224 
 225         private HBox getAddItemHBox() {
 226             HBox hb = new HBox();
 227             Label lb = new Label("Add item");
 228             final TextField tf = TextFieldBuilder.create().prefWidth(50).id(ADD_ITEM_TEXT_FIELD_ID).build();
 229 
 230             Label atLb = new Label("at pos");
 231             final TextField tfPos = TextFieldBuilder.create().prefWidth(50).id(ADD_ITEM_POSITION_TEXT_FIELD_ID).build();
 232 
 233             Button bt = ButtonBuilder.create().text("Add!").id(ADD_ITEM_BUTTON_ID).build();
 234             bt.setOnAction(new EventHandler() {
 235                 public void handle(Event t) {
 236                     ((ListView) testedControl).getItems().add(Integer.parseInt(tfPos.getText()), tf.getText());
 237                 }
 238             });
 239             hb.getChildren().addAll(lb, tf, atLb, tfPos, bt);
 240             return hb;
 241         }
 242 
 243         private HBox getRemoveItemHBox() {
 244             HBox hb = new HBox();
 245             Label lb = new Label("From position");
 246             final TextField tf = TextFieldBuilder.create().text("0").prefWidth(50).id(REMOVE_ITEM_POS_TEXT_FIELD_ID).build();
 247             Button bt = ButtonBuilder.create().text("Remove!").id(REMOVE_BUTTON_ID).build();
 248             bt.setOnAction(new EventHandler() {
 249                 public void handle(Event t) {
 250                     int index = Integer.parseInt(tf.getText());
 251                     ((ListView) testedControl).getItems().remove(index);
 252                 }
 253             });
 254             hb.getChildren().addAll(lb, tf, bt);
 255             return hb;
 256         }
 257 
 258         private HBox getScrollToHBox() {
 259             HBox hb = new HBox();
 260             Button button = ButtonBuilder.create().text("ScrollTo").id(SCROLL_TO_BUTTON_ID).build();
 261             final TextField tf = TextFieldBuilder.create().text("0").id(SCROLL_TO_TEXT_FIELD_ID).build();
 262 
 263             button.setOnAction(new EventHandler<ActionEvent>() {
 264                 public void handle(ActionEvent t) {
 265                     ((ListView) testedControl).scrollTo(Integer.parseInt(tf.getText()));
 266                 }
 267             });
 268 
 269             hb.getChildren().addAll(button, tf);
 270             return hb;
 271         }
 272 
 273         private HBox getAddRectangleHbox() {
 274             HBox hb = new HBox();
 275             Label lb = new Label("Add rectangle at pos");
 276             final TextField tfPos = TextFieldBuilder.create().prefWidth(50).id(ADD_RECTANGLE_TEXT_FIELD_ID).build();
 277             Button bt = ButtonBuilder.create().text("Add!").id(ADD_RECTANGLE_BUTTON_ID).build();
 278             bt.setOnAction(new EventHandler() {
 279                 public void handle(Event t) {
 280                     int index = Integer.parseInt(tfPos.getText());
 281                     ((ListView) testedControl).getItems().add(index, new Group(getNewRectangle()));
 282                 }
 283             });
 284             hb.getChildren().addAll(lb, tfPos, bt);
 285             return hb;
 286         }
 287 
 288         private HBox getAddFormHbox() {
 289             HBox hb = new HBox();
 290             Label lb = new Label("Add form at pos");
 291             final TextField tfPos = TextFieldBuilder.create().prefWidth(50).id(ADD_FORM_TEXT_FIELD_ID).build();
 292             Button bt = ButtonBuilder.create().text("Add!").id(ADD_FORM_BUTTON_ID).build();
 293             bt.setOnAction(new EventHandler() {
 294                 public void handle(Event t) {
 295                     int index = Integer.parseInt(tfPos.getText());
 296                     ((ListView) testedControl).getItems().add(index, new Group(getNewForm()));
 297                 }
 298             });
 299             hb.getChildren().addAll(lb, tfPos, bt);
 300             return hb;
 301         }
 302 
 303         private HBox getAddTextFieldHbox() {
 304             HBox hb = new HBox();
 305             Label lb = new Label("Add textField at pos");
 306             final TextField tfPos = TextFieldBuilder.create().prefWidth(50).id(ADD_TEXT_FIELD_TEXT_FIELD_ID).build();
 307             Button bt = ButtonBuilder.create().text("Add!").id(ADD_TEXT_FIELD_BUTTON_ID).build();
 308             bt.setOnAction(new EventHandler() {
 309                 public void handle(Event t) {
 310                     int index = Integer.parseInt(tfPos.getText());
 311                     ((ListView) testedControl).getItems().add(index, new Group(getNewTextField()));
 312                 }
 313             });
 314             hb.getChildren().addAll(lb, tfPos, bt);
 315             return hb;
 316         }
 317 
 318         private HBox getStartMotionHBox() {
 319             HBox hb = new HBox();
 320             Button startMotion = ButtonBuilder.create().text("start motion").id(START_MOTION_BUTTON_ID).build();
 321             Label label = new Label(" of element at position ");
 322             final TextField tf = TextFieldBuilder.create().text("0").id(START_MOTION_TEXT_FIELD_ID).build();
 323             startMotion.setOnAction(new EventHandler() {
 324                 public void handle(Event t) {
 325                     cm.applyTransition((Node) ((ListView) testedControl).getItems().get(Integer.parseInt(tf.getText())));
 326                     cm.getTimeline().play();
 327                 }
 328             });
 329             hb.getChildren().addAll(startMotion, label, tf);
 330             return hb;
 331         }
 332 
 333         private HBox getIncreaseScaleHBox() {
 334             HBox hb = new HBox();
 335             final TextField tf = TextFieldBuilder.create().text("0").id(INCREASE_SCALE_TEXT_FIELD_ID).build();
 336             Label label = new Label(" of node on position ");
 337             Button increaseScaleButton = ButtonBuilder.create().id(INCREASE_SCALE_BUTTON_ID).text("Increase scale").build();
 338             increaseScaleButton.setOnAction(new EventHandler<ActionEvent>() {
 339                 public void handle(ActionEvent t) {
 340                     Node content = (Node) ((ListView) testedControl).getItems().get(Integer.parseInt(tf.getText()));
 341                     content.setScaleX(content.getScaleX() + 0.15);
 342                     content.setScaleY(content.getScaleY() + 0.15);
 343                 }
 344             });
 345             hb.getChildren().addAll(increaseScaleButton, label, tf);
 346             return hb;
 347         }
 348 
 349         private HBox getDecreaseScaleHBox() {
 350             HBox hb = new HBox();
 351             final TextField tf = TextFieldBuilder.create().text("0").id(DECREASE_SCALE_TEXT_FIELD_ID).build();
 352             Label label = new Label(" of node on position ");
 353             Button increaseScaleButton = ButtonBuilder.create().id(DECREASE_SCALE_BUTTON_ID).text("Decrease scale").build();
 354             increaseScaleButton.setOnAction(new EventHandler<ActionEvent>() {
 355                 public void handle(ActionEvent t) {
 356                     Node content = (Node) ((ListView) testedControl).getItems().get(Integer.parseInt(tf.getText()));
 357                     content.setScaleX(content.getScaleX() - 0.15);
 358                     content.setScaleY(content.getScaleY() - 0.15);
 359                 }
 360             });
 361             hb.getChildren().addAll(increaseScaleButton, label, tf);
 362             return hb;
 363         }
 364 
 365         private Group getNewRectangle() {
 366             return createCustomContent(200, 200);
 367         }
 368 
 369         private VBox getNewForm() {
 370             return createFormComponent();
 371         }
 372 
 373         private TextField getNewTextField() {
 374             return TextFieldBuilder.create().id("CONTENT_TEXT_FIELD_" + (textFieldsCounter++) + "_ID").build();
 375         }
 376     }
 377 }