1 /*
   2   test
   3   @bug 6190768 6190778
   4   @summary Tests that triggering events on AWT list by pressing CTRL + HOME, CTRL + END, PG-UP, PG-DOWN similar Motif behavior
   5   @author Dmitry.Cherepanov@SUN.COM area=awt.list
   6   @run applet KeyEventsTest.html
   7 */
   8 
   9 /**
  10  * KeyEventsTest.html
  11  *
  12  * summary:
  13  */
  14 
  15 import java.applet.Applet;
  16 import java.awt.*;
  17 import java.awt.event.*;
  18 import java.util.Set;
  19 import java.lang.reflect.*;
  20 import sun.awt.SunToolkit;
  21 
  22 public class KeyEventsTest extends Applet implements ItemListener, FocusListener, KeyListener
  23 {
  24     TestState currentState;
  25     final Object LOCK = new Object();
  26     final int ACTION_TIMEOUT = 500;
  27 
  28     List single = new List(3, false);
  29     List multiple = new List(3, true);
  30 
  31     Panel p1 = new Panel ();
  32     Panel p2 = new Panel ();
  33 
  34     public void init()
  35     {
  36         setLayout (new BorderLayout ());
  37 
  38         single.add("0");
  39         single.add("1");
  40         single.add("2");
  41         single.add("3");
  42         single.add("4");
  43         single.add("5");
  44         single.add("6");
  45         single.add("7");
  46         single.add("8");
  47 
  48         multiple.add("0");
  49         multiple.add("1");
  50         multiple.add("2");
  51         multiple.add("3");
  52         multiple.add("4");
  53         multiple.add("5");
  54         multiple.add("6");
  55         multiple.add("7");
  56         multiple.add("8");
  57 
  58         single.addKeyListener(this);
  59         single.addItemListener(this);
  60         single.addFocusListener(this);
  61         p1.add(single);
  62         add("North", p1);
  63 
  64         multiple.addKeyListener(this);
  65         multiple.addItemListener(this);
  66         multiple.addFocusListener(this);
  67         p2.add(multiple);
  68         add("South", p2);
  69 
  70     }//End  init()
  71 
  72     public void start ()
  73     {
  74 
  75         try{
  76             setSize (200,200);
  77             setVisible(true);
  78             validate();
  79 
  80             main(null);
  81 
  82         } catch (Exception e) {
  83             e.printStackTrace();
  84             throw new RuntimeException("The test failed.");
  85         }
  86 
  87     }// start()
  88 
  89     private void main(String[] args)
  90       throws InterruptedException, InvocationTargetException {
  91 
  92         doTest();
  93 
  94         System.out.println("Test passed.");
  95     }
  96 
  97     public void itemStateChanged (ItemEvent ie) {
  98         System.out.println("itemStateChanged-"+ie);
  99         this.currentState.setAction(true);
 100     }
 101 
 102     public void focusGained(FocusEvent e){
 103 
 104         synchronized (LOCK) {
 105             LOCK.notifyAll();
 106         }
 107 
 108     }
 109 
 110     public void focusLost(FocusEvent e){
 111     }
 112 
 113     public void keyPressed(KeyEvent e){
 114         System.out.println("keyPressed-"+e);
 115     }
 116 
 117     public void keyReleased(KeyEvent e){
 118         System.out.println("keyReleased-"+e);
 119     }
 120 
 121     public void keyTyped(KeyEvent e){
 122         System.out.println("keyTyped-"+e);
 123     }
 124 
 125     private void test(TestState currentState)
 126       throws InterruptedException, InvocationTargetException {
 127 
 128         synchronized (LOCK) {
 129 
 130             this.currentState = currentState;
 131             System.out.println(this.currentState);
 132 
 133             List list;
 134             if (currentState.getMultiple()){
 135                 list = multiple;
 136             }else{
 137                 list = single;
 138             }
 139 
 140             Robot r;
 141             try {
 142                 r = new Robot();
 143             } catch(AWTException e) {
 144                 throw new RuntimeException(e.getMessage());
 145             }
 146 
 147             r.delay(10);
 148             Point loc = this.getLocationOnScreen();
 149 
 150             r.mouseMove(loc.x+10, loc.y+10);
 151             r.mousePress(InputEvent.BUTTON1_MASK);
 152             r.delay(10);
 153             r.mouseRelease(InputEvent.BUTTON1_MASK);
 154             r.delay(10);
 155 
 156             list.requestFocusInWindow();
 157             LOCK.wait(ACTION_TIMEOUT);
 158             if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != list){
 159                 throw new RuntimeException("Test failed - list isn't focus owner.");
 160             }
 161 
 162             list.deselect(0);
 163             list.deselect(1);
 164             list.deselect(2);
 165             list.deselect(3);
 166             list.deselect(4);
 167             list.deselect(5);
 168             list.deselect(6);
 169             list.deselect(7);
 170             list.deselect(8);
 171 
 172             int selectIndex = 0;
 173             int visibleIndex = 0;
 174 
 175             if (currentState.getScrollMoved()){
 176 
 177                 if (currentState.getKeyID() == KeyEvent.VK_PAGE_UP ||
 178                     currentState.getKeyID() == KeyEvent.VK_HOME){
 179                     selectIndex = 8;
 180                     visibleIndex = 8;
 181                 }else if (currentState.getKeyID() == KeyEvent.VK_PAGE_DOWN ||
 182                     currentState.getKeyID() == KeyEvent.VK_END){
 183                     selectIndex = 0;
 184                     visibleIndex = 0;
 185                 }
 186 
 187             }else{
 188 
 189                 if (currentState.getKeyID() == KeyEvent.VK_PAGE_UP ||
 190                     currentState.getKeyID() == KeyEvent.VK_HOME){
 191 
 192                     if (currentState.getSelectedMoved()){
 193                         selectIndex = 1;
 194                         visibleIndex = 0;
 195                     }else{
 196                         selectIndex = 0;
 197                         visibleIndex = 0;
 198                     }
 199 
 200                 }else if (currentState.getKeyID() == KeyEvent.VK_PAGE_DOWN ||
 201                     currentState.getKeyID() == KeyEvent.VK_END){
 202 
 203                     if (currentState.getSelectedMoved()){
 204                         selectIndex = 7;
 205                         visibleIndex = 8;
 206                     }else{
 207                         selectIndex = 8;
 208                         visibleIndex = 8;
 209                     }
 210 
 211                 }
 212 
 213             }
 214 
 215             list.select(selectIndex);
 216             list.makeVisible(visibleIndex);
 217 
 218             r.delay(10);
 219 
 220             if (currentState.getKeyID() == KeyEvent.VK_HOME ||
 221                 currentState.getKeyID() == KeyEvent.VK_END){
 222                 r.keyPress(KeyEvent.VK_CONTROL);
 223             }
 224 
 225             r.delay(10);
 226             r.keyPress(currentState.getKeyID());
 227             r.delay(10);
 228             r.keyRelease(currentState.getKeyID());
 229             r.delay(10);
 230 
 231             if (currentState.getKeyID() == KeyEvent.VK_HOME ||
 232                 currentState.getKeyID() == KeyEvent.VK_END){
 233                 r.keyRelease(KeyEvent.VK_CONTROL);
 234             }
 235 
 236             ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
 237             r.delay(200);
 238 
 239             if (currentState.getTemplate() != currentState.getAction())
 240                 throw new RuntimeException("Test failed.");
 241 
 242         }
 243 
 244     }
 245 
 246     private void doTest()
 247       throws InterruptedException, InvocationTargetException {
 248 
 249         final String os = System.getProperty("os.name");
 250         final boolean isWin = os.startsWith("Win");
 251 
 252         System.out.println("multiple? selectedMoved? ?scrollMoved keyID? template? action?");
 253         test(new TestState(false, false, false, KeyEvent.VK_PAGE_UP, isWin?false:false));
 254         // SelectedMoved (false) != ScrollMoved (true) for single list not emulated
 255         test(new TestState(false, true, false, KeyEvent.VK_PAGE_UP, isWin?true:false));
 256         test(new TestState(false, true, true, KeyEvent.VK_PAGE_UP, isWin?true:true));
 257         test(new TestState(true, false, false, KeyEvent.VK_PAGE_UP, isWin?true:false));
 258         test(new TestState(true, false, true, KeyEvent.VK_PAGE_UP, isWin?true:false));
 259         test(new TestState(true, true, false, KeyEvent.VK_PAGE_UP, isWin?true:false));
 260         test(new TestState(true, true, true, KeyEvent.VK_PAGE_UP, isWin?true:false));
 261 
 262         test(new TestState(false, false, false, KeyEvent.VK_PAGE_DOWN, isWin?false:false));
 263         test(new TestState(false, true, false, KeyEvent.VK_PAGE_DOWN, isWin?true:false));
 264         test(new TestState(false, true, true, KeyEvent.VK_PAGE_DOWN, isWin?true:true));
 265         test(new TestState(true, false, false, KeyEvent.VK_PAGE_DOWN, isWin?true:false));
 266         test(new TestState(true, false, true, KeyEvent.VK_PAGE_DOWN, isWin?true:false));
 267         test(new TestState(true, true, false, KeyEvent.VK_PAGE_DOWN, isWin?true:false));
 268         test(new TestState(true, true, true, KeyEvent.VK_PAGE_DOWN, isWin?true:false));
 269 
 270         test(new TestState(false, false, false, KeyEvent.VK_HOME, isWin?false:true));
 271         test(new TestState(false, true, false, KeyEvent.VK_HOME, isWin?true:true));
 272         test(new TestState(false, true, true, KeyEvent.VK_HOME, isWin?true:true));
 273         test(new TestState(true, false, false, KeyEvent.VK_HOME, isWin?true:false));
 274         test(new TestState(true, false, true, KeyEvent.VK_HOME, isWin?true:false));
 275         test(new TestState(true, true, false, KeyEvent.VK_HOME, isWin?true:false));
 276         test(new TestState(true, true, true, KeyEvent.VK_HOME, isWin?true:false));
 277 
 278         test(new TestState(false, false, false, KeyEvent.VK_END, isWin?false:true));
 279         test(new TestState(false, true, false, KeyEvent.VK_END, isWin?true:true));
 280         test(new TestState(false, true, true, KeyEvent.VK_END, isWin?true:true));
 281         test(new TestState(true, false, false, KeyEvent.VK_END, isWin?true:false));
 282         test(new TestState(true, false, true, KeyEvent.VK_END, isWin?true:false));
 283         test(new TestState(true, true, false, KeyEvent.VK_END, isWin?true:false));
 284         test(new TestState(true, true, true, KeyEvent.VK_END, isWin?true:false));
 285 
 286     }
 287 }// class KeyEventsTest
 288 
 289 class TestState{
 290 
 291     private boolean multiple;
 292     // after key pressing selected item moved
 293     private final boolean selectedMoved;
 294     // after key pressing scroll moved
 295     private final boolean scrollMoved;
 296     private final int keyID;
 297     private final boolean template;
 298     private boolean action;
 299 
 300     public TestState(boolean multiple, boolean selectedMoved, boolean scrollMoved, int keyID, boolean template){
 301         this.multiple = multiple;
 302         this.selectedMoved = selectedMoved;
 303         this.scrollMoved = scrollMoved;
 304         this.keyID = keyID;
 305         this.template = template;
 306         this.action = false;
 307     }
 308 
 309     public boolean getMultiple(){
 310         return multiple;
 311     }
 312     public boolean getSelectedMoved(){
 313         return selectedMoved;
 314     }
 315 
 316     public boolean getScrollMoved(){
 317         return scrollMoved;
 318     }
 319 
 320     public int getKeyID(){
 321         return keyID;
 322     }
 323 
 324     public boolean getTemplate(){
 325         return template;
 326     }
 327 
 328     public boolean getAction(){
 329         return action;
 330     }
 331 
 332     public void setAction(boolean action){
 333         this.action = action;
 334     }
 335 
 336     public String toString(){
 337         return multiple + "," + selectedMoved + "," + scrollMoved + "," + keyID + "," + template + "," + action;
 338     }
 339 }// TestState