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(30, FLOW_HEIGHT / 2, Color.AQUA); 205 rect.setStroke(Color.BLUE); 206 tf.getChildren().add(new Text("\n")); 207 tf.getChildren().add(rect); 208 } 209 } 210 211 private class LineBreakInOneTextNodeCase extends TestCase { 212 213 @Override 214 protected void prepareCase(TextFlow tf) { 215 Text text = new Text("This is first line\nThis is second line"); 216 tf.getChildren().add(text); 217 } 218 } 219 220 private class LineBreakByOverflowTextNode1Case extends TestCase { 221 222 @Override 223 protected void prepareCase(TextFlow tf) { 224 Text text = new Text("This is first lineeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeee"); 225 tf.getChildren().add(text); 226 text = new Text("This is second lineeeeeeeeeeeeee eeeeeeeeeeeee"); 227 tf.getChildren().add(text); 228 } 229 } 230 231 private class LineBreakByOverflowTextNode2Case extends TestCase { 232 233 @Override 234 protected void prepareCase(TextFlow tf) { 235 Rectangle rect = new Rectangle(); 236 rect.setHeight(FLOW_HEIGHT / 2 - 30); 237 rect.setWidth(30); 238 rect.setFill(Color.AQUA); 239 rect.setStroke(Color.BLUE); 240 tf.getChildren().add(rect); 241 Text text = new Text("This is first lineeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); 242 tf.getChildren().add(text); 243 } 244 } 245 246 private class BigNumberOfWordsCase extends TestCase { 247 248 @Override 249 protected void prepareCase(TextFlow tf) { 250 for (int i = 0; i < 230; i++) { 251 tf.getChildren().add(new Text("WORD" + i + "")); 252 } 253 } 254 } 255 256 private class CheckLayoutSizeCase extends TestNode { 257 258 @Override 259 public Node drawNode() { 260 HBox testBox = new HBox(); 261 Pane testPane = new StackPane(testBox); 262 testPane.setPrefHeight(HEIGHT); 263 testPane.setPrefWidth(WIDTH); 264 testPane.setMinHeight(HEIGHT); 265 testPane.setMinWidth(WIDTH); 266 testPane.setMaxHeight(HEIGHT); 267 testPane.setMaxWidth(WIDTH); 268 testPane.setStyle("-fx-background-color: green;"); 269 testBox.setFillHeight(false); 270 addGrid(testBox, new Label("Etalon Label")); 271 addGrid(testBox, new TextFlow(new Text("Text in Flow"))); 272 addGrid(testBox, new TextFlow(new Label("Label in Flow"))); 273 addGrid(testBox, new TextFlow(new Button("Button in Flow"))); 274 addGrid(testBox, new TextFlow(new Rectangle(100, 20))); 275 276 return testPane; 277 } 278 279 private void addGrid(HBox root, Node testNode) { 280 GridPane gp = new GridPane(); 281 testNode.setStyle("-fx-border-color: blue;"); 282 gp.addRow(0, testNode); 283 gp.setStyle("-fx-border-color: red;-fx-background-color:white"); 284 root.getChildren().add(gp); 285 } 286 } 287 }