changeset 2735:8bddd11809ac

Drop 6578583; upstreamed. 2011-09-08 Andrew John Hughes <ahughes@redhat.com> * patches/openjdk/6578583-modality-broken-vista.patch: Removed. * Makefile.am: Drop above patch, upstreamed.
author Andrew John Hughes <ahughes@redhat.com>
date Fri, 09 Sep 2011 00:03:53 +0100
parents fb9bfc043a45
children 57c656c119a0
files ChangeLog Makefile.am patches/openjdk/6578583-modality-broken-vista.patch
diffstat 3 files changed, 6 insertions(+), 1447 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Sep 08 18:10:28 2011 +0200
+++ b/ChangeLog	Fri Sep 09 00:03:53 2011 +0100
@@ -1,3 +1,9 @@
+2011-09-08  Andrew John Hughes  <ahughes@redhat.com>
+
+	* patches/openjdk/6578583-modality-broken-vista.patch:
+	Removed.
+	* Makefile.am: Drop above patch, upstreamed.
+
 2011-09-08  Pavel Tisnovsky  <ptisnovs@redhat.com>
 
 	* Makefile.am: added new patch
--- a/Makefile.am	Thu Sep 08 18:10:28 2011 +0200
+++ b/Makefile.am	Fri Sep 09 00:03:53 2011 +0100
@@ -188,7 +188,6 @@
 
 ICEDTEA_PATCHES = \
 	$(SECURITY_PATCHES) \
-	patches/openjdk/6578583-modality-broken-vista.patch \
 	patches/openjdk/6610244-modal-fatal-error-windows.patch \
 	patches/stdc-limit-macros.patch \
 	patches/openjdk/4993545-nativeinlightfixer.patch \
--- a/patches/openjdk/6578583-modality-broken-vista.patch	Thu Sep 08 18:10:28 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1446 +0,0 @@
-# HG changeset patch
-# User dcherepanov
-# Date 1205521233 -10800
-# Node ID 15ba7093f8e64e1facdfc48b8929edc6a4fbb0d3
-# Parent  92e3f57c933b45c678abcbccaa47de059dfe926a
-6578583: Regression: Modality is broken in windows vista home premium from jdk1.7 b02 onwards.
-Summary: WS_DISABLED style should be used to fix some modality bugs
-Reviewed-by: art, son
-
-diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Component.cpp
---- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Component.cpp	Fri Mar 14 20:40:09 2008 +0300
-+++ openjdk/jdk/src/windows/native/sun/windows/awt_Component.cpp	Fri Mar 14 22:00:33 2008 +0300
-@@ -5425,7 +5425,13 @@
- void AwtComponent::Enable(BOOL bEnable)
- {
-     sm_suppressFocusAndActivation = TRUE;
-+
-+    if (bEnable && IsTopLevel()) {
-+        // we should not enable blocked toplevels
-+        bEnable = !::IsWindow(AwtWindow::GetModalBlocker(GetHWnd()));
-+    }
-     ::EnableWindow(GetHWnd(), bEnable);
-+
-     sm_suppressFocusAndActivation = FALSE;
-     CriticalSection::Lock l(GetLock());
-     VerifyState();
-diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Dialog.cpp
---- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Dialog.cpp	Fri Mar 14 20:40:09 2008 +0300
-+++ openjdk/jdk/src/windows/native/sun/windows/awt_Dialog.cpp	Fri Mar 14 22:00:33 2008 +0300
-@@ -273,6 +273,10 @@
-         {
-             HWND blocker = AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(hWnd));
-             HWND topMostBlocker = blocker;
-+            HWND prevForegroundWindow = ::GetForegroundWindow();
-+            if (::IsWindow(blocker)) {
-+                ::BringWindowToTop(hWnd);
-+            }
-             while (::IsWindow(blocker)) {
-                 topMostBlocker = blocker;
-                 ::BringWindowToTop(blocker);
-@@ -282,7 +286,7 @@
-                 // no beep/flash if the mouse was clicked in the taskbar menu
-                 // or the dialog is currently inactive
-                 if ((::WindowFromPoint(mhs->pt) == hWnd) &&
--                    (::GetForegroundWindow() == topMostBlocker))
-+                    (prevForegroundWindow == topMostBlocker))
-                 {
-                     ::MessageBeep(MB_OK);
-                     // some heuristics: 3 times x 64 milliseconds
-@@ -292,6 +296,7 @@
-                     ::BringWindowToTop(topMostBlocker);
-                     ::SetForegroundWindow(topMostBlocker);
-                 }
-+                return 1;
-             }
-         }
-     }
-diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Window.cpp
---- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Window.cpp	Fri Mar 14 20:40:09 2008 +0300
-+++ openjdk/jdk/src/windows/native/sun/windows/awt_Window.cpp	Fri Mar 14 22:00:33 2008 +0300
-@@ -180,7 +180,6 @@
-     }
- 
-     ::RemoveProp(GetHWnd(), ModalBlockerProp);
--    ::RemoveProp(GetHWnd(), ModalSaveWSEXProp);
- 
-     if (m_grabbedWindow == this) {
-         Ungrab();
-@@ -1455,20 +1454,17 @@
-     if (!::IsWindow(window)) {
-         return;
-     }
--    DWORD exStyle = ::GetWindowLong(window, GWL_EXSTYLE);
-+
-     if (::IsWindow(blocker)) {
--        // save WS_EX_NOACTIVATE and WS_EX_APPWINDOW styles
--        DWORD saveStyle = exStyle & (AWT_WS_EX_NOACTIVATE | WS_EX_APPWINDOW);
--        ::SetProp(window, ModalSaveWSEXProp, reinterpret_cast<HANDLE>(saveStyle));
--        ::SetWindowLong(window, GWL_EXSTYLE, (exStyle | AWT_WS_EX_NOACTIVATE) & ~WS_EX_APPWINDOW);
-         ::SetProp(window, ModalBlockerProp, reinterpret_cast<HANDLE>(blocker));
-+        ::EnableWindow(window, FALSE);
-     } else {
--        // restore WS_EX_NOACTIVATE and WS_EX_APPWINDOW styles
--        DWORD saveStyle = reinterpret_cast<DWORD>(::GetProp(window, ModalSaveWSEXProp));
--        ::SetWindowLong(window, GWL_EXSTYLE,
--                        (exStyle & ~(AWT_WS_EX_NOACTIVATE | WS_EX_APPWINDOW)) | saveStyle);
--        ::RemoveProp(window, ModalSaveWSEXProp);
-         ::RemoveProp(window, ModalBlockerProp);
-+         AwtComponent *comp = AwtComponent::GetComponent(window);
-+         // we don't expect to be called with non-java HWNDs
-+         DASSERT(comp && comp->IsTopLevel());
-+         // we should not unblock disabled toplevels
-+         ::EnableWindow(window, comp->isEnabled());
-     }
- }
- 
-diff -r 92e3f57c933b -r 15ba7093f8e6 src/windows/native/sun/windows/awt_Window.h
---- openjdk.orig/jdk/src/windows/native/sun/windows/awt_Window.h	Fri Mar 14 20:40:09 2008 +0300
-+++ openjdk/jdk/src/windows/native/sun/windows/awt_Window.h	Fri Mar 14 22:00:33 2008 +0300
-@@ -33,7 +33,6 @@
- 
- // property name tagging windows disabled by modality
- static LPCTSTR ModalBlockerProp = TEXT("SunAwtModalBlockerProp");
--static LPCTSTR ModalSaveWSEXProp = TEXT("SunAwtModalSaveWSEXProp");
- static LPCTSTR ModalDialogPeerProp = TEXT("SunAwtModalDialogPeerProp");
- 
- #ifndef WH_MOUSE_LL
-diff -r 92e3f57c933b -r 15ba7093f8e6 test/java/awt/Modal/WsDisabledStyle/CloseBlocker/CloseBlocker.java
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ openjdk/jdk/test/java/awt/Modal/WsDisabledStyle/CloseBlocker/CloseBlocker.java	Fri Mar 14 22:00:33 2008 +0300
-@@ -0,0 +1,466 @@
-+/*
-+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-+ * CA 95054 USA or visit www.sun.com if you need additional information or
-+ * have any questions.
-+ */
-+
-+/*
-+  @test %I% %E%
-+  @bug 4080029
-+  @summary Modal Dialog block input to all frame windows not just its parent.
-+  @author dmitry.cherepanov: area=awt.modal
-+  @run main/manual CloseBlocker
-+*/
-+
-+/**
-+ * ManualMainTest.java
-+ *
-+ * summary: The test opens and closes blocker dialog, the test verifies
-+ *          that active window is correct when the dialog is closed.
-+ */
-+
-+import java.awt.*;
-+import java.awt.event.*;
-+
-+public class CloseBlocker
-+{
-+
-+    private static void init()
-+    {
-+        //*** Create instructions for the user here ***
-+
-+        String[] instructions =
-+        {
-+            " the test will be run 6 times, to start next test just close all ",
-+            " windows of previous; the instructions are the same for all tests: ",
-+            " 1) there are two frames (one the frames has 'show modal' button), ",
-+            " 2) press the button to show a dialog, ",
-+            " 3) close the dialog (an alternative scenario - activate another",
-+            "    native window before closing the dialog), ",
-+            " 4) the frame with button should become next active window, ",
-+            "    if it's true, then the test passed, otherwise, it failed. ",
-+            " Press 'pass' button only after all of the 6 tests are completed, ",
-+            " the number of the currently executed test is displayed on the ",
-+            " output window. "
-+        };
-+        Sysout.createDialog( );
-+        Sysout.printInstructions( instructions );
-+
-+        test(true, true, false);
-+        test(true, true, true);
-+        test(false, true, false); // 3rd parameter has no affect for ownerless
-+
-+        test(true, false, false);
-+        test(true, false, true);
-+        test(false, false, false); // 3rd parameter has no affect for ownerless
-+
-+    }//End  init()
-+
-+    private static final Object obj = new Object();
-+    private static int counter = 0;
-+
-+    /*
-+     * The ownerless parameter indicates whether the blocker dialog
-+     * has owner. The usual parameter indicates whether the blocker
-+     * dialog is a Java dialog (non-native dialog like file dialog).
-+     */
-+    private static void test(final boolean ownerless, final boolean usual, final boolean initiallyOwnerIsActive) {
-+
-+        Sysout.print(" * test #" + (++counter) + " is running ... ");
-+
-+        final Frame active = new Frame();
-+        final Frame nonactive = new Frame();
-+        Button button = new Button("show modal");
-+        button.addActionListener(new ActionListener() {
-+               public void actionPerformed(ActionEvent ae) {
-+                    Dialog dialog = null;
-+                    Frame parent = ownerless ? null : (initiallyOwnerIsActive? active : nonactive);
-+                    if (usual) {
-+                        dialog = new Dialog(parent, "Sample", true);
-+                    } else {
-+                        dialog = new FileDialog(parent, "Sample", FileDialog.LOAD);
-+                    }
-+                    dialog.addWindowListener(new WindowAdapter(){
-+                        public void windowClosing(WindowEvent e){
-+                                e.getWindow().dispose();
-+                        }
-+                    });
-+                    dialog.setBounds(200, 200, 200, 200);
-+                    dialog.setVisible(true);
-+                }
-+        });
-+
-+        active.add(button);
-+        active.setBounds(200, 400, 200, 200);
-+        WindowAdapter adapter = new WindowAdapter(){
-+              public void windowClosing(WindowEvent e){
-+                    active.dispose();
-+                    nonactive.dispose();
-+                    synchronized(obj) {
-+                        obj.notify();
-+                    }
-+                }
-+             };
-+        active.addWindowListener(adapter);
-+        active.setVisible(true);
-+
-+        nonactive.setBounds(400, 400, 200, 200);
-+        nonactive.addWindowListener(adapter);
-+        nonactive.setVisible(true);
-+
-+        synchronized(obj) {
-+            try{
-+                obj.wait();
-+            } catch(Exception e) {
-+                throw new RuntimeException(e);
-+            }
-+        }
-+
-+        Sysout.println(" completed. ");
-+
-+    }
-+
-+    /*****************************************************
-+     * Standard Test Machinery Section
-+     * DO NOT modify anything in this section -- it's a
-+     * standard chunk of code which has all of the
-+     * synchronisation necessary for the test harness.
-+     * By keeping it the same in all tests, it is easier
-+     * to read and understand someone else's test, as
-+     * well as insuring that all tests behave correctly
-+     * with the test harness.
-+     * There is a section following this for test-defined
-+     * classes
-+     ******************************************************/
-+    private static boolean theTestPassed = false;
-+    private static boolean testGeneratedInterrupt = false;
-+    private static String failureMessage = "";
-+
-+    private static Thread mainThread = null;
-+
-+    private static int sleepTime = 300000;
-+
-+    public static void main( String args[] ) throws InterruptedException
-+    {
-+        mainThread = Thread.currentThread();
-+        try
-+        {
-+            init();
-+        }
-+        catch( TestPassedException e )
-+        {
-+            //The test passed, so just return from main and harness will
-+            // interepret this return as a pass
-+            return;
-+        }
-+        //At this point, neither test passed nor test failed has been
-+        // called -- either would have thrown an exception and ended the
-+        // test, so we know we have multiple threads.
-+
-+        //Test involves other threads, so sleep and wait for them to
-+        // called pass() or fail()
-+        try
-+        {
-+            Thread.sleep( sleepTime );
-+            //Timed out, so fail the test
-+            throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
-+        }
-+        catch (InterruptedException e)
-+        {
-+            if( ! testGeneratedInterrupt ) throw e;
-+
-+            //reset flag in case hit this code more than once for some reason (just safety)
-+            testGeneratedInterrupt = false;
-+            if ( theTestPassed == false )
-+            {
-+                throw new RuntimeException( failureMessage );
-+            }
-+        }
-+
-+    }//main
-+
-+    public static synchronized void setTimeoutTo( int seconds )
-+    {
-+        sleepTime = seconds * 1000;
-+    }
-+
-+    public static synchronized void pass()
-+    {
-+        Sysout.println( "The test passed." );
-+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
-+        //first check if this is executing in main thread
-+        if ( mainThread == Thread.currentThread() )
-+        {
-+            //Still in the main thread, so set the flag just for kicks,
-+            // and throw a test passed exception which will be caught
-+            // and end the test.
-+            theTestPassed = true;
-+            throw new TestPassedException();
-+        }
-+        //pass was called from a different thread, so set the flag and interrupt
-+        // the main thead.
-+        theTestPassed = true;
-+        testGeneratedInterrupt = true;
-+        mainThread.interrupt();
-+    }//pass()
-+
-+    public static synchronized void fail()
-+    {
-+        //test writer didn't specify why test failed, so give generic
-+        fail( "it just plain failed! :-)" );
-+    }
-+
-+    public static synchronized void fail( String whyFailed )
-+    {
-+        Sysout.println( "The test failed: " + whyFailed );
-+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
-+        //check if this called from main thread
-+        if ( mainThread == Thread.currentThread() )
-+        {
-+            //If main thread, fail now 'cause not sleeping
-+            throw new RuntimeException( whyFailed );
-+        }
-+        theTestPassed = false;
-+        testGeneratedInterrupt = true;
-+        failureMessage = whyFailed;
-+        mainThread.interrupt();
-+    }//fail()
-+
-+}// class ManualMainTest
-+
-+//This exception is used to exit from any level of call nesting
-+// when it's determined that the test has passed, and immediately
-+// end the test.
-+class TestPassedException extends RuntimeException
-+{
-+}
-+
-+//*********** End Standard Test Machinery Section **********
-+
-+
-+//************ Begin classes defined for the test ****************
-+
-+// make listeners in a class defined here, and instantiate them in init()
-+
-+/* Example of a class which may be written as part of a test
-+class NewClass implements anInterface
-+ {
-+   static int newVar = 0;
-+
-+   public void eventDispatched(AWTEvent e)
-+    {
-+      //Counting events to see if we get enough
-+      eventCount++;
-+
-+      if( eventCount == 20 )
-+       {
-+         //got enough events, so pass
-+
-+         ManualMainTest.pass();
-+       }
-+      else if( tries == 20 )
-+       {
-+         //tried too many times without getting enough events so fail
-+
-+         ManualMainTest.fail();
-+       }
-+
-+    }// eventDispatched()
-+
-+ }// NewClass class
-+
-+*/
-+
-+
-+//************** End classes defined for the test *******************
-+
-+
-+
-+
-+/****************************************************
-+ Standard Test Machinery
-+ DO NOT modify anything below -- it's a standard
-+  chunk of code whose purpose is to make user
-+  interaction uniform, and thereby make it simpler
-+  to read and understand someone else's test.
-+ ****************************************************/
-+
-+/**
-+ This is part of the standard test machinery.
-+ It creates a dialog (with the instructions), and is the interface
-+  for sending text messages to the user.
-+ To print the instructions, send an array of strings to Sysout.createDialog
-+  WithInstructions method.  Put one line of instructions per array entry.
-+ To display a message for the tester to see, simply call Sysout.println
-+  with the string to be displayed.
-+ This mimics System.out.println but works within the test harness as well
-+  as standalone.
-+ */
-+
-+class Sysout
-+{
-+    private static TestDialog dialog;
-+
-+    public static void createDialogWithInstructions( String[] instructions )
-+    {
-+        dialog = new TestDialog( new Frame(), "Instructions" );
-+        dialog.printInstructions( instructions );
-+        dialog.setVisible(true);
-+        println( "Any messages for the tester will display here." );
-+    }
-+
-+    public static void createDialog( )
-+    {
-+        dialog = new TestDialog( new Frame(), "Instructions" );
-+        String[] defInstr = { "Instructions will appear here. ", "" } ;
-+        dialog.printInstructions( defInstr );
-+        dialog.setVisible(true);
-+        println( "Any messages for the tester will display here." );
-+    }
-+
-+
-+    public static void printInstructions( String[] instructions )
-+    {
-+        dialog.printInstructions( instructions );
-+    }
-+
-+
-+    public static void println( String messageIn )
-+    {
-+        dialog.displayMessage( messageIn, true );
-+    }
-+
-+    public static void print( String messageIn )
-+    {
-+        dialog.displayMessage( messageIn, false );
-+    }
-+
-+}// Sysout  class
-+
-+/**
-+  This is part of the standard test machinery.  It provides a place for the
-+   test instructions to be displayed, and a place for interactive messages
-+   to the user to be displayed.
-+  To have the test instructions displayed, see Sysout.
-+  To have a message to the user be displayed, see Sysout.
-+  Do not call anything in this dialog directly.
-+  */
-+class TestDialog extends Dialog implements ActionListener
-+{
-+
-+    TextArea instructionsText;
-+    TextArea messageText;
-+    int maxStringLength = 80;
-+    Panel  buttonP = new Panel();
-+    Button passB = new Button( "pass" );
-+    Button failB = new Button( "fail" );
-+
-+    //DO NOT call this directly, go through Sysout
-+    public TestDialog( Frame frame, String name )
-+    {
-+        super( frame, name );
-+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
-+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
-+        add( "North", instructionsText );
-+
-+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
-+        add("Center", messageText);
-+
-+        passB = new Button( "pass" );
-+        passB.setActionCommand( "pass" );
-+        passB.addActionListener( this );
-+        buttonP.add( "East", passB );
-+
-+        failB = new Button( "fail" );
-+        failB.setActionCommand( "fail" );
-+        failB.addActionListener( this );
-+        buttonP.add( "West", failB );
-+
-+        add( "South", buttonP );
-+        pack();
-+
-+        setVisible(true);
-+    }// TestDialog()
-+
-+    //DO NOT call this directly, go through Sysout
-+    public void printInstructions( String[] instructions )
-+    {
-+        //Clear out any current instructions
-+        instructionsText.setText( "" );
-+
-+        //Go down array of instruction strings
-+
-+        String printStr, remainingStr;
-+        for( int i=0; i < instructions.length; i++ )
-+        {
-+            //chop up each into pieces maxSringLength long
-+            remainingStr = instructions[ i ];
-+            while( remainingStr.length() > 0 )
-+            {
-+                //if longer than max then chop off first max chars to print
-+                if( remainingStr.length() >= maxStringLength )
-+                {
-+                    //Try to chop on a word boundary
-+                    int posOfSpace = remainingStr.
-+                        lastIndexOf( ' ', maxStringLength - 1 );
-+
-+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
-+
-+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
-+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
-+                }
-+                //else just print
-+                else
-+                {
-+                    printStr = remainingStr;
-+                    remainingStr = "";
-+                }
-+
-+                instructionsText.append( printStr + "\n" );
-+
-+            }// while
-+
-+        }// for
-+
-+    }//printInstructions()
-+
-+    //DO NOT call this directly, go through Sysout
-+    public void displayMessage( String messageIn, boolean nextLine )
-+    {
-+        messageText.append( messageIn + (nextLine? "\n" : "") );
-+        System.out.println(messageIn);
-+    }
-+
-+    //catch presses of the passed and failed buttons.
-+    //simply call the standard pass() or fail() static methods of
-+    //ManualMainTest
-+    public void actionPerformed( ActionEvent e )
-+    {
-+        if( e.getActionCommand() == "pass" )
-+        {
-+            CloseBlocker.pass();
-+        }
-+        else
-+        {
-+            CloseBlocker.fail();
-+        }
-+    }
-+
-+}// TestDialog  class
-diff -r 92e3f57c933b -r 15ba7093f8e6 test/java/awt/Modal/WsDisabledStyle/OverBlocker/OverBlocker.java
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ openjdk/jdk/test/java/awt/Modal/WsDisabledStyle/OverBlocker/OverBlocker.java	Fri Mar 14 22:00:33 2008 +0300
-@@ -0,0 +1,456 @@
-+/*
-+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-+ * CA 95054 USA or visit www.sun.com if you need additional information or
-+ * have any questions.
-+ */
-+
-+/*
-+  @test %I% %E%
-+  @bug 4080029
-+  @summary Modal Dialog block input to all frame windows not just its parent.
-+  @author dmitry.cherepanov: area=awt.modal
-+  @run main/manual OverBlocker
-+*/
-+
-+/**
-+ * OverBlocker.java
-+ *
-+ * summary: The test verifies that if user tries to activate the blocked dialog
-+ *          then the blocker dialog appears over the other windows
-+ */
-+
-+import java.awt.*;
-+import java.awt.event.*;
-+
-+public class OverBlocker
-+{
-+
-+    private static void init()
-+    {
-+        //*** Create instructions for the user here ***
-+
-+        String[] instructions =
-+        {
-+            " the test will be run 4 times, to start next test just close all ",
-+            " windows of previous; the instructions are the same for all tests: ",
-+            " 1) there is a frame with 'show modal' button, ",
-+            " 2) press the button to show a dialog, ",
-+            " 3) activate any non-Java application, move the app over the dialog, ",
-+            " 4) click on the frame by mouse, ",
-+            " 5) make sure that the dialog comes up from the application and ",
-+            "    now the dialog overlaps the app as well as the frame, ",
-+            "    if it's true, then the test passed, otherwise, it failed. ",
-+            " Press 'pass' button only after all of the 4 tests are completed, ",
-+            " the number of the currently executed test is displayed on the ",
-+            " output window. "
-+        };
-+        Sysout.createDialog( );
-+        Sysout.printInstructions( instructions );
-+
-+        test(false, true);
-+        test(true, true);
-+        test(true, false);
-+        test(false, false);
-+
-+    }//End  init()
-+
-+    private static final Object obj = new Object();
-+    private static int counter = 0;
-+
-+    /*
-+     * The ownerless parameter indicates whether the blocker dialog
-+     * has owner. The usual parameter indicates whether the blocker
-+     * dialog is a Java dialog (non-native dialog like file dialog).
-+     */
-+    private static void test(final boolean ownerless, final boolean usual) {
-+
-+        Sysout.print(" * test #" + (++counter) + " is running ... ");
-+
-+        final Frame frame = new Frame();
-+        Button button = new Button("show modal");
-+        button.addActionListener(new ActionListener() {
-+              public void actionPerformed(ActionEvent ae) {
-+                    Dialog dialog = null;
-+                    Frame parent = ownerless ? null : frame;
-+                    if (usual) {
-+                        dialog = new Dialog(parent, "Sample", true);
-+                    } else {
-+                        dialog = new FileDialog(parent, "Sample", FileDialog.LOAD);
-+                    }
-+                    dialog.addWindowListener(new WindowAdapter(){
-+                            public void windowClosing(WindowEvent e){
-+                                e.getWindow().dispose();
-+                            }
-+                       });
-+                    dialog.setBounds(200, 200, 200, 200);
-+                    dialog.setVisible(true);
-+                }
-+            });
-+        frame.add(button);
-+        frame.setBounds(400, 400, 200, 200);
-+        frame.addWindowListener(new WindowAdapter(){
-+              public void windowClosing(WindowEvent e){
-+                    e.getWindow().dispose();
-+                    synchronized(obj) {
-+                        obj.notify();
-+                    }
-+                }
-+             });
-+        frame.setVisible(true);
-+
-+        synchronized(obj) {
-+            try{
-+                obj.wait();
-+            } catch(Exception e) {
-+                throw new RuntimeException(e);
-+            }
-+        }
-+
-+        Sysout.println(" completed. ");
-+
-+    }
-+
-+    /*****************************************************
-+     * Standard Test Machinery Section
-+     * DO NOT modify anything in this section -- it's a
-+     * standard chunk of code which has all of the
-+     * synchronisation necessary for the test harness.
-+     * By keeping it the same in all tests, it is easier
-+     * to read and understand someone else's test, as
-+     * well as insuring that all tests behave correctly
-+     * with the test harness.
-+     * There is a section following this for test-defined
-+     * classes
-+     ******************************************************/
-+    private static boolean theTestPassed = false;
-+    private static boolean testGeneratedInterrupt = false;
-+    private static String failureMessage = "";
-+
-+    private static Thread mainThread = null;
-+
-+    private static int sleepTime = 300000;
-+
-+    public static void main( String args[] ) throws InterruptedException
-+    {
-+        mainThread = Thread.currentThread();
-+        try
-+        {
-+            init();
-+        }
-+        catch( TestPassedException e )
-+        {
-+            //The test passed, so just return from main and harness will
-+            // interepret this return as a pass
-+            return;
-+        }
-+        //At this point, neither test passed nor test failed has been
-+        // called -- either would have thrown an exception and ended the
-+        // test, so we know we have multiple threads.
-+
-+        //Test involves other threads, so sleep and wait for them to
-+        // called pass() or fail()
-+        try
-+        {
-+            Thread.sleep( sleepTime );
-+            //Timed out, so fail the test
-+            throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
-+        }
-+        catch (InterruptedException e)
-+        {
-+            if( ! testGeneratedInterrupt ) throw e;
-+
-+            //reset flag in case hit this code more than once for some reason (just safety)
-+            testGeneratedInterrupt = false;
-+            if ( theTestPassed == false )
-+            {
-+                throw new RuntimeException( failureMessage );
-+            }
-+        }
-+
-+    }//main
-+
-+    public static synchronized void setTimeoutTo( int seconds )
-+    {
-+        sleepTime = seconds * 1000;
-+    }
-+
-+    public static synchronized void pass()
-+    {
-+        Sysout.println( "The test passed." );
-+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
-+        //first check if this is executing in main thread
-+        if ( mainThread == Thread.currentThread() )
-+        {
-+            //Still in the main thread, so set the flag just for kicks,
-+            // and throw a test passed exception which will be caught
-+            // and end the test.
-+            theTestPassed = true;
-+            throw new TestPassedException();
-+        }
-+        //pass was called from a different thread, so set the flag and interrupt
-+        // the main thead.
-+        theTestPassed = true;
-+        testGeneratedInterrupt = true;
-+        mainThread.interrupt();
-+    }//pass()
-+
-+    public static synchronized void fail()
-+    {
-+        //test writer didn't specify why test failed, so give generic
-+        fail( "it just plain failed! :-)" );
-+    }
-+
-+    public static synchronized void fail( String whyFailed )
-+    {
-+        Sysout.println( "The test failed: " + whyFailed );
-+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
-+        //check if this called from main thread
-+        if ( mainThread == Thread.currentThread() )
-+        {
-+            //If main thread, fail now 'cause not sleeping
-+            throw new RuntimeException( whyFailed );
-+        }
-+        theTestPassed = false;
-+        testGeneratedInterrupt = true;
-+        failureMessage = whyFailed;
-+        mainThread.interrupt();
-+    }//fail()
-+
-+}// class ManualMainTest
-+
-+//This exception is used to exit from any level of call nesting
-+// when it's determined that the test has passed, and immediately
-+// end the test.
-+class TestPassedException extends RuntimeException
-+{
-+}
-+
-+//*********** End Standard Test Machinery Section **********
-+
-+
-+//************ Begin classes defined for the test ****************
-+
-+// make listeners in a class defined here, and instantiate them in init()
-+
-+/* Example of a class which may be written as part of a test
-+class NewClass implements anInterface
-+ {
-+   static int newVar = 0;
-+
-+   public void eventDispatched(AWTEvent e)
-+    {
-+      //Counting events to see if we get enough
-+      eventCount++;
-+
-+      if( eventCount == 20 )
-+       {
-+         //got enough events, so pass
-+
-+         ManualMainTest.pass();
-+       }
-+      else if( tries == 20 )
-+       {
-+         //tried too many times without getting enough events so fail
-+
-+         ManualMainTest.fail();
-+       }
-+
-+    }// eventDispatched()
-+
-+ }// NewClass class
-+
-+*/
-+
-+
-+//************** End classes defined for the test *******************
-+
-+
-+
-+
-+/****************************************************
-+ Standard Test Machinery
-+ DO NOT modify anything below -- it's a standard
-+  chunk of code whose purpose is to make user
-+  interaction uniform, and thereby make it simpler
-+  to read and understand someone else's test.
-+ ****************************************************/
-+
-+/**
-+ This is part of the standard test machinery.
-+ It creates a dialog (with the instructions), and is the interface
-+  for sending text messages to the user.
-+ To print the instructions, send an array of strings to Sysout.createDialog
-+  WithInstructions method.  Put one line of instructions per array entry.
-+ To display a message for the tester to see, simply call Sysout.println
-+  with the string to be displayed.
-+ This mimics System.out.println but works within the test harness as well
-+  as standalone.
-+ */
-+
-+class Sysout
-+{
-+    private static TestDialog dialog;
-+
-+    public static void createDialogWithInstructions( String[] instructions )
-+    {
-+        dialog = new TestDialog( new Frame(), "Instructions" );
-+        dialog.printInstructions( instructions );
-+        dialog.setVisible(true);
-+        println( "Any messages for the tester will display here." );
-+    }
-+
-+    public static void createDialog( )
-+    {
-+        dialog = new TestDialog( new Frame(), "Instructions" );
-+        String[] defInstr = { "Instructions will appear here. ", "" } ;
-+        dialog.printInstructions( defInstr );
-+        dialog.setVisible(true);
-+        println( "Any messages for the tester will display here." );
-+    }
-+
-+
-+    public static void printInstructions( String[] instructions )
-+    {
-+        dialog.printInstructions( instructions );
-+    }
-+
-+
-+    public static void println( String messageIn )
-+    {
-+        dialog.displayMessage( messageIn, true );
-+    }
-+
-+    public static void print( String messageIn )
-+    {
-+        dialog.displayMessage( messageIn, false );
-+    }
-+
-+}// Sysout  class
-+
-+/**
-+  This is part of the standard test machinery.  It provides a place for the
-+   test instructions to be displayed, and a place for interactive messages
-+   to the user to be displayed.
-+  To have the test instructions displayed, see Sysout.
-+  To have a message to the user be displayed, see Sysout.
-+  Do not call anything in this dialog directly.
-+  */
-+class TestDialog extends Dialog implements ActionListener
-+{
-+
-+    TextArea instructionsText;
-+    TextArea messageText;
-+    int maxStringLength = 80;
-+    Panel  buttonP = new Panel();
-+    Button passB = new Button( "pass" );
-+    Button failB = new Button( "fail" );
-+
-+    //DO NOT call this directly, go through Sysout
-+    public TestDialog( Frame frame, String name )
-+    {
-+        super( frame, name );
-+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
-+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
-+        add( "North", instructionsText );
-+
-+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
-+        add("Center", messageText);
-+
-+        passB = new Button( "pass" );
-+        passB.setActionCommand( "pass" );
-+        passB.addActionListener( this );
-+        buttonP.add( "East", passB );
-+
-+        failB = new Button( "fail" );
-+        failB.setActionCommand( "fail" );
-+        failB.addActionListener( this );
-+        buttonP.add( "West", failB );
-+
-+        add( "South", buttonP );
-+        pack();
-+
-+        setVisible(true);
-+    }// TestDialog()
-+
-+    //DO NOT call this directly, go through Sysout
-+    public void printInstructions( String[] instructions )
-+    {
-+        //Clear out any current instructions
-+        instructionsText.setText( "" );
-+
-+        //Go down array of instruction strings
-+
-+        String printStr, remainingStr;
-+        for( int i=0; i < instructions.length; i++ )
-+        {
-+            //chop up each into pieces maxSringLength long
-+            remainingStr = instructions[ i ];
-+            while( remainingStr.length() > 0 )
-+            {
-+                //if longer than max then chop off first max chars to print
-+                if( remainingStr.length() >= maxStringLength )
-+                {
-+                    //Try to chop on a word boundary
-+                    int posOfSpace = remainingStr.
-+                        lastIndexOf( ' ', maxStringLength - 1 );
-+
-+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
-+
-+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
-+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
-+                }
-+                //else just print
-+                else
-+                {
-+                    printStr = remainingStr;
-+                    remainingStr = "";
-+                }
-+
-+                instructionsText.append( printStr + "\n" );
-+
-+            }// while
-+
-+        }// for
-+
-+    }//printInstructions()
-+
-+    //DO NOT call this directly, go through Sysout
-+    public void displayMessage( String messageIn, boolean nextLine )
-+    {
-+        messageText.append( messageIn + (nextLine? "\n" : "") );
-+        System.out.println(messageIn);
-+    }
-+
-+    //catch presses of the passed and failed buttons.
-+    //simply call the standard pass() or fail() static methods of
-+    //ManualMainTest
-+    public void actionPerformed( ActionEvent e )
-+    {
-+        if( e.getActionCommand() == "pass" )
-+        {
-+            OverBlocker.pass();
-+        }
-+        else
-+        {
-+            OverBlocker.fail();
-+        }
-+    }
-+
-+}// TestDialog  class
-diff -r 92e3f57c933b -r 15ba7093f8e6 test/java/awt/Modal/WsDisabledStyle/Winkey/Winkey.java
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ openjdk/jdk/test/java/awt/Modal/WsDisabledStyle/Winkey/Winkey.java	Fri Mar 14 22:00:33 2008 +0300
-@@ -0,0 +1,403 @@
-+/*
-+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-+ * CA 95054 USA or visit www.sun.com if you need additional information or
-+ * have any questions.
-+ */
-+
-+/*
-+  @test %I% %E%
-+  @bug 6572263 6571808
-+  @summary  PIT:FileDialog minimized to taskbar(through 'Show Desktop')selecting the fileDialog using windowList
-+  @author dmitry.cherepanov: area=awt.modal
-+  @run main/manual Winkey
-+*/
-+
-+/**
-+ * Winkey.java
-+ *
-+ * summary: the test verifies that pressing combination of Windows key
-+ *          and M key to minimize all windows doesn't break AWT modality
-+ */
-+
-+import java.awt.*;
-+import java.awt.event.*;
-+
-+public class Winkey
-+{
-+
-+    private static void init()
-+    {
-+        //*** Create instructions for the user here ***
-+
-+        String[] instructions =
-+        {
-+            " 1. there is a frame with a 'show modal' button, ",
-+            " 2. press the button to show a modal dialog, ",
-+            " 3. the modal dialog will be shown over the frame, ",
-+            " 4. please verify that all (5.1, 5.2.1, 5.2.2) the following tests pass: ",
-+            " ",
-+            " 5.1. press combination Windows Key and M key to minimize all windows, ",
-+            " 5.2. press combination Windows Key and D key to show desktop, ",
-+            "      5.2.1. restore the dialog by choosing this one in the ALT-TAB list, ",
-+            "      5.2.2. restore the dialog by mouse click on taskbar (on java or any other item)",
-+            " ",
-+            " 6. make sure that the dialog and the frame are visible, ",
-+            "    the bounds of the windows should be the same as before, ",
-+            "    if it's true, then the test passed; otherwise, it failed. "
-+        };
-+        Sysout.createDialog( );
-+        Sysout.printInstructions( instructions );
-+
-+        final Frame frame = new Frame();
-+        Button button = new Button("show modal");
-+        button.addActionListener(new ActionListener() {
-+                public void actionPerformed(ActionEvent ae) {
-+                    FileDialog dialog = new FileDialog((Frame)null, "Sample", FileDialog.LOAD);
-+                    dialog.setVisible(true);
-+                }
-+            });
-+        frame.add(button);
-+        frame.setBounds(400, 400, 200, 200);
-+        frame.setVisible(true);
-+
-+    }//End  init()
-+
-+    /*****************************************************
-+     * Standard Test Machinery Section
-+     * DO NOT modify anything in this section -- it's a
-+     * standard chunk of code which has all of the
-+     * synchronisation necessary for the test harness.
-+     * By keeping it the same in all tests, it is easier
-+     * to read and understand someone else's test, as
-+     * well as insuring that all tests behave correctly
-+     * with the test harness.
-+     * There is a section following this for test-defined
-+     * classes
-+     ******************************************************/
-+    private static boolean theTestPassed = false;
-+    private static boolean testGeneratedInterrupt = false;
-+    private static String failureMessage = "";
-+
-+    private static Thread mainThread = null;
-+
-+    private static int sleepTime = 300000;
-+
-+    public static void main( String args[] ) throws InterruptedException
-+    {
-+        mainThread = Thread.currentThread();
-+        try
-+        {
-+            init();
-+        }
-+        catch( TestPassedException e )
-+        {
-+            //The test passed, so just return from main and harness will
-+            // interepret this return as a pass
-+            return;
-+        }
-+        //At this point, neither test passed nor test failed has been
-+        // called -- either would have thrown an exception and ended the
-+        // test, so we know we have multiple threads.
-+
-+        //Test involves other threads, so sleep and wait for them to
-+        // called pass() or fail()
-+        try
-+        {
-+            Thread.sleep( sleepTime );
-+            //Timed out, so fail the test
-+            throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
-+        }
-+        catch (InterruptedException e)
-+        {
-+            if( ! testGeneratedInterrupt ) throw e;
-+
-+            //reset flag in case hit this code more than once for some reason (just safety)
-+            testGeneratedInterrupt = false;
-+            if ( theTestPassed == false )
-+            {
-+                throw new RuntimeException( failureMessage );
-+            }
-+        }
-+
-+    }//main
-+
-+    public static synchronized void setTimeoutTo( int seconds )
-+    {
-+        sleepTime = seconds * 1000;
-+    }
-+
-+    public static synchronized void pass()
-+    {
-+        Sysout.println( "The test passed." );
-+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
-+        //first check if this is executing in main thread
-+        if ( mainThread == Thread.currentThread() )
-+        {
-+            //Still in the main thread, so set the flag just for kicks,
-+            // and throw a test passed exception which will be caught
-+            // and end the test.
-+            theTestPassed = true;
-+            throw new TestPassedException();
-+        }
-+        //pass was called from a different thread, so set the flag and interrupt
-+        // the main thead.
-+        theTestPassed = true;
-+        testGeneratedInterrupt = true;
-+        mainThread.interrupt();
-+    }//pass()
-+
-+    public static synchronized void fail()
-+    {
-+        //test writer didn't specify why test failed, so give generic
-+        fail( "it just plain failed! :-)" );
-+    }
-+
-+    public static synchronized void fail( String whyFailed )
-+    {
-+        Sysout.println( "The test failed: " + whyFailed );
-+        Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
-+        //check if this called from main thread
-+        if ( mainThread == Thread.currentThread() )
-+        {
-+            //If main thread, fail now 'cause not sleeping
-+            throw new RuntimeException( whyFailed );
-+        }
-+        theTestPassed = false;
-+        testGeneratedInterrupt = true;
-+        failureMessage = whyFailed;
-+        mainThread.interrupt();
-+    }//fail()
-+
-+}// class ManualMainTest
-+
-+//This exception is used to exit from any level of call nesting
-+// when it's determined that the test has passed, and immediately
-+// end the test.
-+class TestPassedException extends RuntimeException
-+{
-+}
-+
-+//*********** End Standard Test Machinery Section **********
-+
-+
-+//************ Begin classes defined for the test ****************
-+
-+// make listeners in a class defined here, and instantiate them in init()
-+
-+/* Example of a class which may be written as part of a test
-+class NewClass implements anInterface
-+ {
-+   static int newVar = 0;
-+
-+   public void eventDispatched(AWTEvent e)
-+    {
-+      //Counting events to see if we get enough
-+      eventCount++;
-+
-+      if( eventCount == 20 )
-+       {
-+         //got enough events, so pass
-+
-+         ManualMainTest.pass();
-+       }
-+      else if( tries == 20 )
-+       {
-+         //tried too many times without getting enough events so fail
-+
-+         ManualMainTest.fail();
-+       }
-+
-+    }// eventDispatched()
-+
-+ }// NewClass class
-+
-+*/
-+
-+
-+//************** End classes defined for the test *******************
-+
-+
-+
-+
-+/****************************************************
-+ Standard Test Machinery
-+ DO NOT modify anything below -- it's a standard
-+  chunk of code whose purpose is to make user
-+  interaction uniform, and thereby make it simpler
-+  to read and understand someone else's test.
-+ ****************************************************/
-+
-+/**
-+ This is part of the standard test machinery.
-+ It creates a dialog (with the instructions), and is the interface
-+  for sending text messages to the user.
-+ To print the instructions, send an array of strings to Sysout.createDialog
-+  WithInstructions method.  Put one line of instructions per array entry.
-+ To display a message for the tester to see, simply call Sysout.println
-+  with the string to be displayed.
-+ This mimics System.out.println but works within the test harness as well
-+  as standalone.
-+ */
-+
-+class Sysout
-+{
-+    private static TestDialog dialog;
-+
-+    public static void createDialogWithInstructions( String[] instructions )
-+    {
-+        dialog = new TestDialog( new Frame(), "Instructions" );
-+        dialog.printInstructions( instructions );
-+        dialog.setVisible(true);
-+        println( "Any messages for the tester will display here." );
-+    }
-+
-+    public static void createDialog( )
-+    {
-+        dialog = new TestDialog( new Frame(), "Instructions" );
-+        String[] defInstr = { "Instructions will appear here. ", "" } ;
-+        dialog.printInstructions( defInstr );
-+        dialog.setVisible(true);
-+        println( "Any messages for the tester will display here." );
-+    }
-+
-+
-+    public static void printInstructions( String[] instructions )
-+    {
-+        dialog.printInstructions( instructions );
-+    }
-+
-+
-+    public static void println( String messageIn )
-+    {
-+        dialog.displayMessage( messageIn );
-+    }
-+
-+}// Sysout  class
-+
-+/**
-+  This is part of the standard test machinery.  It provides a place for the
-+   test instructions to be displayed, and a place for interactive messages
-+   to the user to be displayed.
-+  To have the test instructions displayed, see Sysout.
-+  To have a message to the user be displayed, see Sysout.
-+  Do not call anything in this dialog directly.
-+  */
-+class TestDialog extends Dialog implements ActionListener
-+{
-+
-+    TextArea instructionsText;
-+    TextArea messageText;
-+    int maxStringLength = 80;
-+    Panel  buttonP = new Panel();
-+    Button passB = new Button( "pass" );
-+    Button failB = new Button( "fail" );
-+
-+    //DO NOT call this directly, go through Sysout
-+    public TestDialog( Frame frame, String name )
-+    {
-+        super( frame, name );
-+        int scrollBoth = TextArea.SCROLLBARS_BOTH;
-+        instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
-+        add( "North", instructionsText );
-+
-+        messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
-+        add("Center", messageText);
-+
-+        passB = new Button( "pass" );
-+        passB.setActionCommand( "pass" );
-+        passB.addActionListener( this );
-+        buttonP.add( "East", passB );
-+
-+        failB = new Button( "fail" );
-+        failB.setActionCommand( "fail" );
-+        failB.addActionListener( this );
-+        buttonP.add( "West", failB );
-+
-+        add( "South", buttonP );
-+        pack();
-+
-+        setVisible(true);
-+    }// TestDialog()
-+
-+    //DO NOT call this directly, go through Sysout
-+    public void printInstructions( String[] instructions )
-+    {
-+        //Clear out any current instructions
-+        instructionsText.setText( "" );
-+
-+        //Go down array of instruction strings
-+
-+        String printStr, remainingStr;
-+        for( int i=0; i < instructions.length; i++ )
-+        {
-+            //chop up each into pieces maxSringLength long
-+            remainingStr = instructions[ i ];
-+            while( remainingStr.length() > 0 )
-+            {
-+                //if longer than max then chop off first max chars to print
-+                if( remainingStr.length() >= maxStringLength )
-+                {
-+                    //Try to chop on a word boundary
-+                    int posOfSpace = remainingStr.
-+                        lastIndexOf( ' ', maxStringLength - 1 );
-+
-+                    if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
-+
-+                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
-+                    remainingStr = remainingStr.substring( posOfSpace + 1 );
-+                }
-+                //else just print
-+                else
-+                {
-+                    printStr = remainingStr;
-+                    remainingStr = "";
-+                }
-+
-+                instructionsText.append( printStr + "\n" );
-+
-+            }// while
-+
-+        }// for
-+
-+    }//printInstructions()
-+
-+    //DO NOT call this directly, go through Sysout
-+    public void displayMessage( String messageIn )
-+    {
-+        messageText.append( messageIn + "\n" );
-+        System.out.println(messageIn);
-+    }
-+
-+    //catch presses of the passed and failed buttons.
-+    //simply call the standard pass() or fail() static methods of
-+    //ManualMainTest
-+    public void actionPerformed( ActionEvent e )
-+    {
-+        if( e.getActionCommand() == "pass" )
-+        {
-+            Winkey.pass();
-+        }
-+        else
-+        {
-+            Winkey.fail();
-+        }
-+    }
-+
-+}// TestDialog  class
-exporting patch:
-<fdopen>