1/* 2 * Copyright (c) 2001, 2015, 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 24import java.awt.*; 25import java.awt.event.*; 26import javax.swing.*; 27/* 28 * test 29 * @bug 4666224 30*/ 31 32public class bug4666224 extends JApplet { 33 final static int placements[] = { JTabbedPane.LEFT, JTabbedPane.RIGHT, JTabbedPane.TOP, JTabbedPane.BOTTOM }; 34 private JTabbedPane tabPane; 35 private JPanel mainPanel; 36 37 public bug4666224() throws Exception { 38 java.awt.EventQueue.invokeAndWait( () -> { 39 tabPane = new JTabbedPane(); 40 tabPane.addMouseListener(new MouseAdapter() { 41 public void mouseClicked(MouseEvent e) { 42 Point pt = e.getPoint(); 43 System.out.println("Index at location: " 44 + tabPane.indexAtLocation(pt.x, pt.y)); 45 } 46 }); 47 InputMap inputMap = createInputMap(); 48 SwingUtilities.replaceUIInputMap(getRootPane(), JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap); 49 ActionMap actionMap = createActionMap(); 50 SwingUtilities.replaceUIActionMap(getRootPane(), actionMap); 51 52 //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 53 tabPane.setTabPlacement(JTabbedPane.TOP); 54 tabPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); 55 JPanel panel = new JPanel(); 56 panel.setPreferredSize(new Dimension(200, 300)); 57 tabPane.addTab("Number Zero", panel); 58 panel = new JPanel(); 59 //panel.requestFocus(); 60 panel.setPreferredSize(new Dimension(200, 300)); 61 tabPane.addTab("Number One", panel); 62 panel = new JPanel(); 63 panel.setPreferredSize(new Dimension(200, 300)); 64 tabPane.addTab("Number Two", panel); 65 panel = new JPanel(); 66 panel.setPreferredSize(new Dimension(200, 300)); 67 tabPane.addTab("Number Three", new JColorChooser()); 68 panel = new JPanel(); 69 panel.setPreferredSize(new Dimension(200, 300)); 70 tabPane.addTab("Number Four", panel); 71 mainPanel = new JPanel(); 72 mainPanel.add(tabPane); 73 74 getContentPane().add(mainPanel); 75 tabPane.requestFocus(); 76 77 78 //pack(); 79 //setVisible(true); 80 }); 81 } 82 83 public void init() { 84 String[][] instructionsSet = 85 { 86 { 87 " Note : Incase of Assertion failure,user can enter", 88 " remarks by pressing 'Assertion Fail Remarks ' button", 89 " ", 90 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 91 " ", 92 " ON ALL PLATFORMS", 93 "1. Click on any of the tabs, focus indicator is visible", 94 "2. Lose focus on the window by clicking on some other window ", 95 "3. Focus indicator should disappear", 96 "4. Regain focus on the window the focus indicator should reappear." , 97 " If focus doesn't behave as above, ", 98 " press 'Assertion Fail' else press 'Assertion Pass'", 99 }, 100 101 { 102 " Note : Incase of Assertion failure,user can enter", 103 " remarks by pressing 'Assertion Fail Remarks ' button", 104 " ", 105 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 106 " ", 107 " ON ALL PLATFORMS", 108 "1. type 'R' to align the tabs to the right side ", 109 "2. Lose focus on the window by clicking on some other window ", 110 "3. Focus indicator should disappear", 111 "4. Regain focus on the window the focus indicator should reappear." , 112 " If focus doesn't behave as above, ", 113 " press 'Assertion Fail' else press 'Assertion Pass'", 114 }, 115 116 { 117 " Note : Incase of Assertion failure,user can enter", 118 " remarks by pressing 'Assertion Fail Remarks ' button", 119 " ", 120 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 121 " ", 122 " ON ALL PLATFORMS", 123 "1. type 'B' to align the tabs to the bottom side ", 124 "2. Lose focus on the window by clicking on some other window ", 125 "3. Focus indicator should disappear", 126 "4. Regain focus on the window the focus indicator should reappear." , 127 " If focus doesn't behave as above, ", 128 " press 'Assertion Fail' else press 'Assertion Pass'", 129 }, 130 131 { 132 " Note : Incase of Assertion failure,user can enter", 133 " remarks by pressing 'Assertion Fail Remarks ' button", 134 " ", 135 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 136 " ", 137 " ON ALL PLATFORMS", 138 "1. type 'L' to align the tabs to the left side ", 139 "2. Lose focus on the window by clicking on some other window ", 140 "3. Focus indicator should disappear", 141 "4. Regain focus on the window the focus indicator should reappear." , 142 " If focus doesn't behave as above, ", 143 " press 'Assertion Fail' else press 'Assertion Pass'", 144 }, 145 146 { 147 " Note : Incase of Assertion failure,user can enter", 148 " remarks by pressing 'Assertion Fail Remarks ' button", 149 " ", 150 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 151 " ", 152 " ON ALL PLATFORMS", 153 "1. type 'C' to change the tab layout to WRAP_TAB_LAYOUT ", 154 "2. Lose focus on the window by clicking on some other window ", 155 "3. Focus indicator should disappear", 156 "4. Regain focus on the window the focus indicator should reappear." , 157 " If focus doesn't behave as above, ", 158 " press 'Assertion Fail' else press 'Assertion Pass'", 159 }, 160 161 { 162 " Note : Incase of Assertion failure,user can enter", 163 " remarks by pressing 'Assertion Fail Remarks ' button", 164 " ", 165 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 166 " ", 167 " ON ALL PLATFORMS", 168 "1. type 'T' to align the tabs to the top side ", 169 "2. Lose focus on the window by clicking on some other window ", 170 "3. Focus indicator should disappear", 171 "4. Regain focus on the window the focus indicator should reappear." , 172 " If focus doesn't behave as above, ", 173 " press 'Assertion Fail' else press 'Assertion Pass'", 174 }, 175 176 { 177 " Note : Incase of Assertion failure,user can enter", 178 " remarks by pressing 'Assertion Fail Remarks ' button", 179 " ", 180 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 181 " ", 182 " ON ALL PLATFORMS", 183 "1. type 'B' to align the tabs to the bottom side ", 184 "2. Lose focus on the window by clicking on some other window ", 185 "3. Focus indicator should disappear", 186 "4. Regain focus on the window the focus indicator should reappear." , 187 " If focus doesn't behave as above, ", 188 " press 'Assertion Fail' else press 'Assertion Pass'", 189 }, 190 191 { 192 " Note : Incase of Assertion failure,user can enter", 193 " remarks by pressing 'Assertion Fail Remarks ' button", 194 " ", 195 " You would see an applet with JTabbedPane. Keep the size of applet variable.", 196 " ", 197 " ON ALL PLATFORMS", 198 "1. type 'R' to align the tabs to the right side ", 199 "2. Lose focus on the window by clicking on some other window ", 200 "3. Focus indicator should disappear", 201 "4. Regain focus on the window the focus indicator should reappear." , 202 " If focus doesn't behave as above, ", 203 " press 'Assertion Fail' else press 'Assertion Pass'", 204 } 205 }; 206 207 String[] exceptionsSet = 208 { 209 "Focus painted incorrectly in tabbed pane(SCROLL_TAB_LAYOUT) when tabs aligned to the TOP of the window", 210 "Focus painted incorrectly in tabbed pane(SCROLL_TAB_LAYOUT) when tabs aligned to the RIGHT of the window", 211 "Focus painted incorrectly in tabbed pane(SCROLL_TAB_LAYOUT) when tabs aligned to the BOTTOM of the window", 212 "Focus painted incorrectly in tabbed pane(SCROLL_TAB_LAYOUT) when tabs aligned to the LEFT of the window", 213 "Focus painted incorrectly in tabbed pane(WRAP_TAB_LAYOUT) when tabs aligned to the LEFT of the window", 214 "Focus painted incorrectly in tabbed pane(WRAP_TAB_LAYOUT) when tabs aligned to the TOP of the window", 215 "Focus painted incorrectly in tabbed pane(WRAP_TAB_LAYOUT) when tabs aligned to the BOTTOM of the window", 216 "Focus painted incorrectly in tabbed pane(WRAP_TAB_LAYOUT) when tabs aligned to the RIGHT of the window" 217 }; 218 219 Sysout.setInstructionsWithExceptions(instructionsSet,exceptionsSet); 220 221 } 222 223 public void start (){} 224 225 public void destroy(){ 226 if(Sysout.failStatus()) { 227 String failMsg = Sysout.getFailureMessages(); 228 failMsg = failMsg.replace('\n',' '); 229 throw new RuntimeException(failMsg); 230 }// End destroy 231 } 232 233 protected InputMap createInputMap() { 234 return LookAndFeel.makeComponentInputMap(getRootPane(), new Object[] { 235 "R", "right", 236 "L", "left", 237 "T", "top", 238 "B", "bottom", 239 "C", "changeLayout", 240 "D", "dump" 241 }); 242 } 243 244 protected ActionMap createActionMap() { 245 ActionMap map = new ActionMap(); 246 map.put("right", new RotateAction(JTabbedPane.RIGHT)); 247 map.put("left", new RotateAction(JTabbedPane.LEFT)); 248 map.put("top", new RotateAction(JTabbedPane.TOP)); 249 map.put("bottom", new RotateAction(JTabbedPane.BOTTOM)); 250 map.put("changeLayout", new ChangeLayoutAction()); 251 map.put("dump", new DumpAction()); 252 return map; 253 } 254 255 private class RotateAction extends AbstractAction { 256 private int placement; 257 public RotateAction(int placement) { 258 this.placement = placement; 259 } 260 261 public void actionPerformed(ActionEvent e) { 262 tabPane.setTabPlacement(placement); 263 } 264 } 265 266 private class ChangeLayoutAction extends AbstractAction { 267 private boolean a = true; 268 public void actionPerformed(ActionEvent e) { 269 if (a) { 270 tabPane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT); 271 a = false; 272 } else { 273 tabPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); 274 a = true; 275 } 276 } 277 } 278 279 private class DumpAction extends AbstractAction { 280 public void actionPerformed(ActionEvent e) { 281 for (int i = 0; i < tabPane.getTabCount(); i++) { 282 System.out.println("Tab: " + i + " " 283 + tabPane.getUI().getTabBounds(tabPane, i)); 284 } 285 } 286 } 287} 288 289 290/**************************************************** 291 Standard Test Machinery 292 DO NOT modify anything below -- it's a standard 293 chunk of code whose purpose is to make user 294 interaction uniform, and thereby make it simpler 295 to read and understand someone else's test. 296 ****************************************************/ 297 298/** 299 This is part of the standard test machinery. 300 It creates a dialog (with the instructions), and is the interface 301 for sending text messages to the user. 302 To print the instructions, send an array of strings to Sysout.createDialog 303 WithInstructions method. Put one line of instructions per array entry. 304 To display a message for the tester to see, simply call Sysout.println 305 with the string to be displayed. 306 This mimics System.out.println but works within the test harness as well 307 as standalone. 308 */ 309 310class Sysout 311 { 312 private static TestDialog dialog; 313 314 public static void createDialogWithInstructions( String[] instructions ) 315 { 316 dialog = new TestDialog( new Frame(), "Instructions" ); 317 dialog.printInstructions( instructions ); 318 dialog.show(); 319 println( "Any messages for the tester will display here." ); 320 } 321 322 public static void createDialog( ) 323 { 324 dialog = new TestDialog( new Frame(), "Instructions" ); 325 String[] defInstr = { "Instructions will appear here. ", "" } ; 326 dialog.printInstructions( defInstr ); 327 dialog.show(); 328 println( "Any messages for the tester will display here." ); 329 } 330 331 332 public static void printInstructions( String[] instructions ) 333 { 334 dialog.printInstructions( instructions ); 335 } 336 337 338 public static void println( String messageIn ) 339 { 340 dialog.displayMessage( messageIn ); 341 } 342 343 public static void setInstructionsWithExceptions(String instructionsSet[][], 344 String exceptionsSet[]) { 345 createDialogWithInstructions(instructionsSet[0]); 346 dialog.setInstructions(instructionsSet); 347 dialog.setExceptionMessages(exceptionsSet); 348 } 349 350 public static String getFailureMessages() { 351 return dialog.failureMessages; 352 } 353 354 public static boolean failStatus() { 355 return dialog.failStatus; 356 } 357 358 }// Sysout class 359 360/** 361 This is part of the standard test machinery. It provides a place for the 362 test instructions to be displayed, and a place for interactive messages 363 to the user to be displayed. 364 To have the test instructions displayed, see Sysout. 365 To have a message to the user be displayed, see Sysout. 366 Do not call anything in this dialog directly. 367 */ 368class TestDialog extends Dialog 369 { 370 371 TextArea instructionsText; 372 TextArea messageText; 373 int maxStringLength = 70; 374 375 Panel assertPanel; 376 Button assertPass,assertFail,remarks; 377 HandleAssert handleAssert; 378 boolean failStatus=false; 379 int instructionCounter=0; 380 String instructions[][]; 381 int exceptionCounter=0; 382 String exceptionMessages[]; 383 String failureMessages="<br>"; 384 String remarksMessage=null; 385 RemarksDialog remarksDialog; 386 387 //DO NOT call this directly, go through Sysout 388 public TestDialog( Frame frame, String name ) 389 { 390 super( frame, name ); 391 int scrollBoth = TextArea.SCROLLBARS_BOTH; 392 instructionsText = new TextArea( "", 14, maxStringLength, scrollBoth ); 393 add( "North", instructionsText ); 394 395 messageText = new TextArea( "", 3, maxStringLength, scrollBoth ); 396 add("Center", messageText); 397 398 assertPanel = new Panel(new FlowLayout()); 399 assertPass=new Button("Assertion Pass"); 400 assertPass.setName("Assertion Pass"); 401 assertFail=new Button("Assertion Fail"); 402 assertFail.setName("Assertion Fail"); 403 remarks = new Button("Assertion Fail Remarks"); 404 remarks.setEnabled(false); 405 remarks.setName("Assertion Remarks"); 406 assertPanel.add(assertPass); 407 assertPanel.add(assertFail); 408 assertPanel.add(remarks); 409 handleAssert = new HandleAssert(); 410 assertPass.addActionListener(handleAssert); 411 assertFail.addActionListener(handleAssert); 412 remarks.addActionListener(handleAssert); 413 add("South",assertPanel); 414 pack(); 415 416 show(); 417 }// TestDialog() 418 419 //DO NOT call this directly, go through Sysout 420 public void printInstructions( String[] instructions ) 421 { 422 //Clear out any current instructions 423 instructionsText.setText( "" ); 424 425 //Go down array of instruction strings 426 427 String printStr, remainingStr; 428 for( int i=0; i < instructions.length; i++ ) 429 { 430 //chop up each into pieces maxSringLength long 431 remainingStr = instructions[ i ]; 432 while( remainingStr.length() > 0 ) 433 { 434 //if longer than max then chop off first max chars to print 435 if( remainingStr.length() >= maxStringLength ) 436 { 437 //Try to chop on a word boundary 438 int posOfSpace = remainingStr. 439 lastIndexOf( ' ', maxStringLength - 1 ); 440 441 if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; 442 443 printStr = remainingStr.substring( 0, posOfSpace + 1 ); 444 remainingStr = remainingStr.substring( posOfSpace + 1 ); 445 } 446 //else just print 447 else 448 { 449 printStr = remainingStr; 450 remainingStr = ""; 451 } 452 453 instructionsText.append( printStr + "\n" ); 454 455 }// while 456 457 }// for 458 459 }//printInstructions() 460 461 //DO NOT call this directly, go through Sysout 462 public void displayMessage( String messageIn ) 463 { 464 messageText.append( messageIn + "\n" ); 465 } 466 467 public void emptyMessage() { 468 messageText.setText(""); 469 } 470 471 public void setInstructions(String insStr[][]) { 472 instructions=insStr; 473 } 474 475 public void setExceptionMessages(String exceptionMessages[]) { 476 this.exceptionMessages=exceptionMessages; 477 } 478 479 class HandleAssert implements ActionListener { 480 public void actionPerformed(ActionEvent ae) { 481 if(ae.getSource()==remarks) { 482 remarksDialog = new RemarksDialog(TestDialog.this, 483 "Assertion Remarks Dialog",true); 484 remarks.setEnabled(false); 485 if(remarksMessage!=null) 486 failureMessages+=". User Remarks : "+remarksMessage; 487 } 488 else { 489 if(instructionCounter<instructions.length-1) { 490 emptyMessage(); 491 instructionCounter++; 492 printInstructions(instructions[instructionCounter]); 493 } 494 else { 495 emptyMessage(); 496 displayMessage("Testcase Completed"); 497 displayMessage("Press 'Done' button in the "+ 498 "BaseApplet to close"); 499 assertPass.setEnabled(false); 500 assertFail.setEnabled(false); 501 } 502 503 if(ae.getSource()==assertPass) { 504 // anything to be done in future 505 } 506 else if(ae.getSource()==assertFail) { 507 remarks.setEnabled(true); 508 if(!failStatus) 509 failStatus=true; 510 if(exceptionCounter<exceptionMessages.length) { 511 failureMessages = failureMessages + "<br>"+ 512 exceptionMessages[exceptionCounter]; 513 } 514 } 515 exceptionCounter++; 516 } 517 } 518 } 519 520 class RemarksDialog extends Dialog implements ActionListener{ 521 Panel rootPanel,remarksPanel; 522 TextArea textarea; 523 Button addRemarks,cancelRemarks; 524 public RemarksDialog(Dialog owner,String title,boolean modal) { 525 super(owner,title,modal); 526 rootPanel = new Panel(new BorderLayout()); 527 remarksPanel = new Panel(new FlowLayout()); 528 textarea = new TextArea(5,30); 529 addRemarks=new Button("Add Remarks"); 530 addRemarks.addActionListener(this); 531 cancelRemarks = new Button("Cancel Remarks"); 532 cancelRemarks.addActionListener(this); 533 remarksPanel.add(addRemarks); 534 remarksPanel.add(cancelRemarks); 535 rootPanel.add(textarea,"Center"); 536 rootPanel.add(remarksPanel,"South"); 537 add(rootPanel); 538 setBounds(150,150,400,200); 539 setVisible(true); 540 } 541 542 public void actionPerformed(ActionEvent ae) { 543 remarksMessage=null; 544 if(ae.getSource()==addRemarks) { 545 String msg = textarea.getText().trim(); 546 if (msg.length()>0) 547 remarksMessage=msg; 548 } 549 dispose(); 550 } 551 552 } 553 554}// TestDialog class 555