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 }