blob: 494be9b0452b2f96ab127649b24cdf3cb35044be [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright (c) 2003-2007 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 @test
26 @bug 4507585
27 @summary Native modal dialog shouldn't block event dispatching when called on EventDispatchThread.
28 @author tav@sparc.spb.su: area=awt.PrintJob
29 @run main/manual=yesno PageSetupDlgBlockingTest
30
31*/
32
33import java.awt.*;
34import java.awt.print.*;
35import java.awt.event.*;
36import javax.swing.*;
37import java.applet.*;
38
39public class PageSetupDlgBlockingTest extends Panel {
40 public static Frame frame = new TestFrame("Test Frame");
41
42 public static void main(String[] args) {
43 PageSetupDlgBlockingTest a = new PageSetupDlgBlockingTest();
44
45 a.init();
46 a.start();
47 }
48
49 public void init()
50 {
51 //Create instructions for the user here, as well as set up
52 // the environment -- set the layout manager, add buttons,
53 // etc.
54 this.setLayout (new BorderLayout ());
55
56 String[] instructions =
57 {
58 "This test verifies that native modal 'Page Setup' dialog doesn't block event",
59 "handling when called on EventDispatchThread.",
60 " ",
61 "After test started you will see 'Test Frame' frame which contains",
62 "one 'Click Me' button.",
63 "1. Click the button:",
64 " - 'Page Setup' dialog will appear.",
65 "2. Drag the dialog over the 'Test Frame' so that to enforce its button redraw:",
66 " - if you're seeing the button redraw (as long as PAINT events are displayed)",
67 " the test PASSED else FAILED."
68 };
69 Sysout.createDialogWithInstructions(instructions);
70 }
71
72
73 public void start() {
74 JButton button = new JButton("Click Me");
75 final AWTEventListener listener = new AWTEventListener() {
76 public void eventDispatched(AWTEvent e) {
77 if (e.getSource().getClass() == TestFrame.class) {
78 Sysout.println(e.paramString() + " on <Test Frame>");
79 }
80 }
81 };
82
83 button.addActionListener(new ActionListener() {
84 public void actionPerformed(ActionEvent e) {
85
86 // Show PAINT events only when the dialog is displayed.
87 Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.PAINT_EVENT_MASK);
88
89 PrinterJob job = PrinterJob.getPrinterJob();
90 job.pageDialog(job.defaultPage());
91
92 Toolkit.getDefaultToolkit().removeAWTEventListener(listener);
93 }
94 });
95
96 button.setSize(100, 50);
97
98 frame.setLayout(new BorderLayout());
99 frame.setSize(200, 200);
100 frame.setLocation(500, 0);
101 frame.add(button, BorderLayout.CENTER);
102 frame.setVisible(true);
103 }
104}
105
106class TestFrame extends Frame {
107 TestFrame(String title) {
108 super(title);
109 }
110}
111
112/****************************************************
113 Standard Test Machinery
114 DO NOT modify anything below -- it's a standard
115 chunk of code whose purpose is to make user
116 interaction uniform, and thereby make it simpler
117 to read and understand someone else's test.
118 ****************************************************/
119
120/**
121 This is part of the standard test machinery.
122 It creates a dialog (with the instructions), and is the interface
123 for sending text messages to the user.
124 To print the instructions, send an array of strings to Sysout.createDialog
125 WithInstructions method. Put one line of instructions per array entry.
126 To display a message for the tester to see, simply call Sysout.println
127 with the string to be displayed.
128 This mimics System.out.println but works within the test harness as well
129 as standalone.
130 */
131
132class Sysout
133{
134 private static TestDialog dialog;
135
136 public static void createDialogWithInstructions( String[] instructions )
137 {
138 dialog = new TestDialog( new Frame(), "Instructions" );
139 dialog.printInstructions( instructions );
140 dialog.setVisible(true);
141 println( "Any messages for the tester will display here." );
142 }
143
144 public static void createDialog( )
145 {
146 dialog = new TestDialog( new Frame(), "Instructions" );
147 String[] defInstr = { "Instructions will appear here. ", "" } ;
148 dialog.printInstructions( defInstr );
149 dialog.setVisible(true);
150 println( "Any messages for the tester will display here." );
151 }
152
153
154 public static void printInstructions( String[] instructions )
155 {
156 dialog.printInstructions( instructions );
157 }
158
159
160 public static void println( String messageIn )
161 {
162 dialog.displayMessage( messageIn );
163 }
164
165}// Sysout class
166
167/**
168 This is part of the standard test machinery. It provides a place for the
169 test instructions to be displayed, and a place for interactive messages
170 to the user to be displayed.
171 To have the test instructions displayed, see Sysout.
172 To have a message to the user be displayed, see Sysout.
173 Do not call anything in this dialog directly.
174 */
175class TestDialog extends Dialog
176{
177
178 TextArea instructionsText;
179 TextArea messageText;
180 int maxStringLength = 80;
181
182 //DO NOT call this directly, go through Sysout
183 public TestDialog( Frame frame, String name )
184 {
185 super( frame, name );
186 int scrollBoth = TextArea.SCROLLBARS_BOTH;
187 instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
188 add( "North", instructionsText );
189
190 messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
191 add("Center", messageText);
192
193 pack();
194
195 setVisible(true);
196 }// TestDialog()
197
198 //DO NOT call this directly, go through Sysout
199 public void printInstructions( String[] instructions )
200 {
201 //Clear out any current instructions
202 instructionsText.setText( "" );
203
204 //Go down array of instruction strings
205
206 String printStr, remainingStr;
207 for( int i=0; i < instructions.length; i++ )
208 {
209 //chop up each into pieces maxSringLength long
210 remainingStr = instructions[ i ];
211 while( remainingStr.length() > 0 )
212 {
213 //if longer than max then chop off first max chars to print
214 if( remainingStr.length() >= maxStringLength )
215 {
216 //Try to chop on a word boundary
217 int posOfSpace = remainingStr.
218 lastIndexOf( ' ', maxStringLength - 1 );
219
220 if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
221
222 printStr = remainingStr.substring( 0, posOfSpace + 1 );
223 remainingStr = remainingStr.substring( posOfSpace + 1 );
224 }
225 //else just print
226 else
227 {
228 printStr = remainingStr;
229 remainingStr = "";
230 }
231
232 instructionsText.append( printStr + "\n" );
233
234 }// while
235
236 }// for
237
238 }//printInstructions()
239
240 //DO NOT call this directly, go through Sysout
241 public void displayMessage( String messageIn )
242 {
243 messageText.append( messageIn + "\n" );
244 System.out.println(messageIn);
245 }
246
247}// TestDialog class