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 }