1/*
2 * Copyright (c) 2007, 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.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * @test
26 * @bug 6488219 6560738 7158350 8017469
27 * @summary Test that text printed in Swing UI measures and looks OK.
28 * @run main/manual=yesno PrintTextTest
29 */
30
31import java.awt.*;
32import javax.swing.*;
33import java.awt.print.*;
34
35public class SwingUIText implements Printable {
36
37    static String[] instructions = {
38        "This tests that when a Swing UI is printed, that the text",
39        "in each component properly matches the length of the component",
40        "as seen on-screen, and that the spacing of the text is of",
41        "reasonable even-ness. This latter part is very subjective and",
42        "the comparison has to be with JDK1.5 GA, or JDK 1.6 GA",
43    };
44
45    static JFrame frame;
46
47    public static void main(String args[]) {
48        SwingUtilities.invokeLater(new Runnable() {
49          public void run() {
50              createUI();
51          }
52      });
53    }
54
55    public static void createUI() {
56
57        Sysout.createDialogWithInstructions(instructions);
58
59        JPanel panel = new JPanel();
60        panel.setLayout(new GridLayout(4,1));
61
62        String text = "marvelous suspicious solving";
63        displayText(panel, text);
64
65        String itext = "\u0641\u0642\u0643 \u0644\u0627\u064b";
66        itext = itext+itext+itext+itext+itext+itext+itext;
67        displayText(panel, itext);
68
69        String itext2 = "\u0641"+text;
70        displayText(panel, itext2);
71
72        JEditorPane editor = new JEditorPane();
73        editor.setContentType("text/html");
74        String CELL = "<TD align=\"center\"><font style=\"font-size: 18;\">Text</font></TD>";
75        String TABLE_BEGIN = "<TABLE BORDER=1 cellpadding=1 cellspacing=0 width=100%>";
76        String TABLE_END = "</TABLE>";
77        StringBuffer buffer = new StringBuffer();
78        buffer.append("<html><body>").append(TABLE_BEGIN);
79        for (int j = 0; j < 15; j++) {
80            buffer.append(CELL);
81        }
82        buffer.append("</tr>");
83        buffer.append(TABLE_END).append("</body></html>");
84        editor.setText(buffer.toString());
85
86        panel.add(editor);
87
88        frame = new JFrame("Swing UI Text Printing Test");
89        frame.getContentPane().add(panel);
90        frame.pack();
91        frame.setVisible(true);
92
93        PrinterJob job = PrinterJob.getPrinterJob();
94        PageFormat pf = job.defaultPage();
95        job.setPrintable(new SwingUIText(), pf);
96        if (job.printDialog()) {
97            try { job.print(); }
98            catch (Exception e) {
99              e.printStackTrace();
100              throw new RuntimeException(e);
101            }
102        }
103    }
104
105
106    static void displayText(JPanel p, String text) {
107        JPanel panel = new JPanel();
108        panel.setLayout(new GridLayout(2,1));
109        JPanel row = new JPanel();
110        Font font = new Font("Dialog", Font.PLAIN, 12);
111
112        JLabel label = new JLabel(text);
113        label.setFont(font);
114        row.add(label);
115
116        JButton button = new JButton("Print "+text);
117        button.setMnemonic('P');
118        button.setFont(font);
119        row.add(button);
120
121        panel.add(row);
122
123        row = new JPanel();
124        JTextField textField = new JTextField(text);
125        row.add(textField);
126
127        JTextArea textArea = new JTextArea();
128        textArea.setText(text);
129        row.add(textArea);
130
131        panel.add(row);
132        p.add(panel);
133    }
134
135    public int print(Graphics g, PageFormat pf, int pageIndex)
136        throws PrinterException {
137
138        if (pageIndex >= 1) {
139            return Printable.NO_SUCH_PAGE;
140        }
141        g.translate((int)pf.getImageableX(), (int)pf.getImageableY());
142        frame.printAll(g);
143
144        return Printable.PAGE_EXISTS;
145    }
146
147}
148
149class Sysout
150 {
151   private static TestDialog dialog;
152
153   public static void createDialogWithInstructions( String[] instructions )
154    {
155      dialog = new TestDialog( new Frame(), "Instructions" );
156      dialog.printInstructions( instructions );
157      dialog.show();
158      println( "Any messages for the tester will display here." );
159    }
160
161   public static void createDialog( )
162    {
163      dialog = new TestDialog( new Frame(), "Instructions" );
164      String[] defInstr = { "Instructions will appear here. ", "" } ;
165      dialog.printInstructions( defInstr );
166      dialog.show();
167      println( "Any messages for the tester will display here." );
168    }
169
170
171   public static void printInstructions( String[] instructions )
172    {
173      dialog.printInstructions( instructions );
174    }
175
176
177   public static void println( String messageIn )
178    {
179      dialog.displayMessage( messageIn );
180    }
181
182 }// Sysout  class
183
184/**
185  This is part of the standard test machinery.  It provides a place for the
186   test instructions to be displayed, and a place for interactive messages
187   to the user to be displayed.
188  To have the test instructions displayed, see Sysout.
189  To have a message to the user be displayed, see Sysout.
190  Do not call anything in this dialog directly.
191  */
192class TestDialog extends Dialog
193 {
194
195   TextArea instructionsText;
196   TextArea messageText;
197   int maxStringLength = 80;
198
199   //DO NOT call this directly, go through Sysout
200   public TestDialog( Frame frame, String name )
201    {
202      super( frame, name );
203      int scrollBoth = TextArea.SCROLLBARS_BOTH;
204      instructionsText = new TextArea( "", 10, maxStringLength, scrollBoth );
205      add( "North", instructionsText );
206
207      messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
208      add("South", messageText);
209
210      pack();
211
212      show();
213    }// TestDialog()
214
215   //DO NOT call this directly, go through Sysout
216   public void printInstructions( String[] instructions )
217    {
218      //Clear out any current instructions
219      instructionsText.setText( "" );
220
221      //Go down array of instruction strings
222
223      String printStr, remainingStr;
224      for( int i=0; i < instructions.length; i++ )
225       {
226     //chop up each into pieces maxSringLength long
227     remainingStr = instructions[ i ];
228     while( remainingStr.length() > 0 )
229      {
230        //if longer than max then chop off first max chars to print
231        if( remainingStr.length() >= maxStringLength )
232         {
233           //Try to chop on a word boundary
234           int posOfSpace = remainingStr.
235          lastIndexOf( ' ', maxStringLength - 1 );
236
237           if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
238
239           printStr = remainingStr.substring( 0, posOfSpace + 1 );
240           remainingStr = remainingStr.substring( posOfSpace + 1 );
241         }
242        //else just print
243        else
244         {
245           printStr = remainingStr;
246           remainingStr = "";
247         }
248
249            instructionsText.append( printStr + "\n" );
250
251      }// while
252
253       }// for
254
255    }//printInstructions()
256
257   //DO NOT call this directly, go through Sysout
258   public void displayMessage( String messageIn )
259    {
260      messageText.append( messageIn + "\n" );
261    }
262
263}// TestDialog  class
264