1 /* 2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 */ 5 package test.scenegraph.richtext; 6 7 import javafx.scene.Node; 8 import javafx.scene.control.Button; 9 import javafx.scene.control.Label; 10 import javafx.scene.layout.GridPane; 11 import javafx.scene.layout.HBox; 12 import javafx.scene.layout.Pane; 13 import javafx.scene.layout.StackPane; 14 import javafx.scene.paint.Color; 15 import javafx.scene.shape.Rectangle; 16 import javafx.scene.text.Text; 17 import javafx.scene.text.TextFlow; 18 import test.javaclient.shared.BasicButtonChooserApp; 19 import test.javaclient.shared.TestNode; 20 import test.javaclient.shared.Utils; 21 22 /** 23 * 24 * @author Andrey Glushchenko 25 */ 26 public class RichTextDifferentCasesApp extends BasicButtonChooserApp { 27 28 private static int WIDTH = 500; 29 private static int HEIGHT = 500; 30 private static String TITLE = "RichText test"; 31 private static int FLOW_HEIGHT = 402; 32 private static int FLOW_WIDTH = 402; 33 34 public RichTextDifferentCasesApp() { 35 super(WIDTH, HEIGHT, TITLE, false); 36 } 37 38 @Override 39 protected TestNode setup() { 40 TestNode rootTestNode = new TestNode(); 41 rootTestNode.add(new AccumulativeErrorTest(), "AccumulativeErrorTest"); 42 rootTestNode.add(new BigVerticalObjectCase(), "BigVerticalObjectTest"); 43 rootTestNode.add(new BigHorizontalObjectCase(), "BigHorizontalObjectTest"); 44 rootTestNode.add(new BigNumberOfWordsCase(), "BigNumberOfWordsTest"); 45 rootTestNode.add(new CheckLayoutSizeCase(), "CheckLayoutSizeTest"); 46 rootTestNode.add(new BigHorizontalObjectLineBreakCase(), "BigHorizontalObjectLineBreakTest"); 47 rootTestNode.add(new BigVerticalObjectLineBreakCase(), "BigVerticalObjectLineBreakTest"); 48 rootTestNode.add(new LineBreakInOneTextNodeCase(), "LineBreakInOneTextNodeTest"); 49 rootTestNode.add(new RectanglesAndBreakLineCase(), "RectanglesAndBreakLineTest"); 50 51 rootTestNode.add(new LineBreakByOverflowTextNode1Case(), "LineBreakByOverflowTextNode1Test"); 52 rootTestNode.add(new LineBreakByOverflowTextNode2Case(), "LineBreakByOverflowTextNode2Test"); 53 54 return rootTestNode; 55 } 56 57 private abstract class TestCase extends TestNode { 58 59 @Override 60 public Node drawNode() { 61 Pane root = new Pane(); 62 root.setStyle("-fx-background-color: green;"); 63 root.setPrefHeight(HEIGHT); 64 root.setPrefWidth(WIDTH); 65 root.setMinHeight(HEIGHT); 66 root.setMinWidth(WIDTH); 67 root.setMaxHeight(HEIGHT); 68 root.setMaxWidth(WIDTH); 69 TextFlow tf = new TextFlow(); 70 tf.setStyle("-fx-border-color: red;-fx-background-color: white;"); 71 tf.setPrefHeight(FLOW_HEIGHT); 72 tf.setPrefWidth(FLOW_WIDTH); 73 tf.setMinHeight(FLOW_HEIGHT - 30); 74 tf.setMinWidth(FLOW_WIDTH - 30); 75 tf.setMaxHeight(FLOW_HEIGHT + 30); 76 tf.setMaxWidth(FLOW_WIDTH + 30); 77 prepareCase(tf); 78 root.getChildren().add(tf); 79 return root; 80 } 81 82 protected abstract void prepareCase(TextFlow tf); 83 } 84 85 public static void main(String[] args) { 86 Utils.launch(RichTextDifferentCasesApp.class, args); 87 } 88 89 private class AccumulativeErrorTest extends TestCase { 90 91 @Override 92 protected void prepareCase(TextFlow tf) { 93 for (int i = 0; i < 100; i++) { 94 Rectangle rect = new Rectangle(3, 99); 95 rect.setFill(Color.AQUA); 96 rect.setStroke(Color.BLUE); 97 tf.getChildren().add(rect); 98 } 99 for (int i = 0; i < 100; i++) { 100 Rectangle rect = new Rectangle(399, 2); 101 rect.setFill(Color.AQUA); 102 rect.setStroke(Color.BLUE); 103 tf.getChildren().add(rect); 104 } 105 } 106 } 107 108 private class BigVerticalObjectCase extends TestCase { 109 110 @Override 111 protected void prepareCase(TextFlow tf) { 112 for (int i = 0; i < 8; i++) { 113 Rectangle rect = new Rectangle(); 114 rect.setHeight(FLOW_HEIGHT - 30); 115 rect.setWidth(20); 116 rect.setFill(Color.AQUA); 117 rect.setStroke(Color.BLUE); 118 tf.getChildren().add(rect); 119 if (i == 5) { 120 rect = new Rectangle(); 121 rect.setHeight(FLOW_HEIGHT + 30); 122 rect.setWidth(100); 123 rect.setFill(Color.AQUA); 124 rect.setStroke(Color.BLUE); 125 tf.getChildren().add(rect); 126 } 127 } 128 129 } 130 } 131 132 private class BigHorizontalObjectCase extends TestCase { 133 134 @Override 135 protected void prepareCase(TextFlow tf) { 136 for (int i = 0; i < 8; i++) { 137 Rectangle rect = new Rectangle(); 138 rect.setWidth(FLOW_WIDTH - 30); 139 rect.setHeight(20); 140 rect.setFill(Color.AQUA); 141 rect.setStroke(Color.BLUE); 142 tf.getChildren().add(rect); 143 if (i == 5) { 144 rect = new Rectangle(); 145 rect.setHeight(100); 146 rect.setWidth(FLOW_WIDTH + 30); 147 rect.setFill(Color.AQUA); 148 rect.setStroke(Color.BLUE); 149 tf.getChildren().add(rect); 150 } 151 } 152 } 153 } 154 155 private class BigHorizontalObjectLineBreakCase extends TestCase { 156 157 @Override 158 protected void prepareCase(TextFlow tf) { 159 tf.getChildren().add(new Rectangle(57, 10)); 160 Rectangle rect = new Rectangle(); 161 rect.setHeight(100); 162 rect.setWidth(FLOW_WIDTH - 60); 163 rect.setFill(Color.AQUA); 164 rect.setStroke(Color.BLUE); 165 tf.getChildren().add(rect); 166 tf.getChildren().add(new Rectangle(57, 10)); 167 rect = new Rectangle(); 168 rect.setHeight(100); 169 rect.setWidth(FLOW_WIDTH - 30); 170 rect.setFill(Color.AQUA); 171 rect.setStroke(Color.BLUE); 172 tf.getChildren().add(rect); 173 tf.getChildren().add(new Rectangle(57, 10)); 174 } 175 } 176 177 private class BigVerticalObjectLineBreakCase extends TestCase { 178 179 @Override 180 protected void prepareCase(TextFlow tf) { 181 tf.getChildren().add(new Rectangle(60, 10)); 182 Rectangle rect = new Rectangle(); 183 rect.setHeight(FLOW_HEIGHT / 2 - 30); 184 rect.setWidth(30); 185 rect.setFill(Color.AQUA); 186 rect.setStroke(Color.BLUE); 187 tf.getChildren().add(rect); 188 tf.getChildren().add(new Text("\n")); 189 tf.getChildren().add(new Rectangle(140, 10)); 190 rect = new Rectangle(); 191 rect.setHeight(FLOW_HEIGHT / 2 - 30); 192 rect.setWidth(30); 193 rect.setFill(Color.AQUA); 194 rect.setStroke(Color.BLUE); 195 tf.getChildren().add(rect); 196 } 197 } 198 199 private class RectanglesAndBreakLineCase extends TestCase { 200 201 @Override 202 protected void prepareCase(TextFlow tf) { 203 tf.getChildren().add(new Rectangle(60, 10)); 204 Rectangle rect = new Rectangle(); 205 rect.setHeight(FLOW_HEIGHT / 2 - 30); 206 rect.setWidth(30); 207 rect.setFill(Color.AQUA); 208 rect.setStroke(Color.BLUE); 209 tf.getChildren().add(rect); 210 tf.getChildren().add(new Text("\n")); 211 } 212 } 213 214 private class LineBreakInOneTextNodeCase extends TestCase { 215 216 @Override 217 protected void prepareCase(TextFlow tf) { 218 Text text = new Text("This is first line\nThis is second line"); 219 tf.getChildren().add(text); 220 } 221 } 222 223 private class LineBreakByOverflowTextNode1Case extends TestCase { 224 225 @Override 226 protected void prepareCase(TextFlow tf) { 227 Text text = new Text("This is first lineeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeee"); 228 tf.getChildren().add(text); 229 text = new Text("This is second lineeeeeeeeeeeeee eeeeeeeeeeeee"); 230 tf.getChildren().add(text); 231 } 232 } 233 234 private class LineBreakByOverflowTextNode2Case extends TestCase { 235 236 @Override 237 protected void prepareCase(TextFlow tf) { 238 Rectangle rect = new Rectangle(); 239 rect.setHeight(FLOW_HEIGHT / 2 - 30); 240 rect.setWidth(30); 241 rect.setFill(Color.AQUA); 242 rect.setStroke(Color.BLUE); 243 tf.getChildren().add(rect); 244 Text text = new Text("This is first lineeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); 245 tf.getChildren().add(text); 246 } 247 } 248 249 private class BigNumberOfWordsCase extends TestCase { 250 251 @Override 252 protected void prepareCase(TextFlow tf) { 253 for (int i = 0; i < 230; i++) { 254 tf.getChildren().add(new Text("WORD" + i + "")); 255 } 256 } 257 } 258 259 private class CheckLayoutSizeCase extends TestNode { 260 261 @Override 262 public Node drawNode() { 263 HBox testBox = new HBox(); 264 Pane testPane = new StackPane(testBox); 265 testPane.setPrefHeight(HEIGHT); 266 testPane.setPrefWidth(WIDTH); 267 testPane.setMinHeight(HEIGHT); 268 testPane.setMinWidth(WIDTH); 269 testPane.setMaxHeight(HEIGHT); 270 testPane.setMaxWidth(WIDTH); 271 testPane.setStyle("-fx-background-color: green;"); 272 testBox.setFillHeight(false); 273 addGrid(testBox, new Label("Etalon Label")); 274 addGrid(testBox, new TextFlow(new Text("Text in Flow"))); 275 addGrid(testBox, new TextFlow(new Label("Label in Flow"))); 276 addGrid(testBox, new TextFlow(new Button("Button in Flow"))); 277 addGrid(testBox, new TextFlow(new Rectangle(100, 20))); 278 279 return testPane; 280 } 281 282 private void addGrid(HBox root, Node testNode) { 283 GridPane gp = new GridPane(); 284 testNode.setStyle("-fx-border-color: blue;"); 285 gp.addRow(0, testNode); 286 gp.setStyle("-fx-border-color: red;-fx-background-color:white"); 287 root.getChildren().add(gp); 288 } 289 } 290 }