--- old/src/java.desktop/windows/native/libawt/windows/awt_List.h 2016-03-18 13:02:32.082970765 +0530 +++ new/src/java.desktop/windows/native/libawt/windows/awt_List.h 2016-03-18 13:02:31.826970765 +0530 @@ -56,6 +56,7 @@ } INLINE void Deselect(int pos) { if (isMultiSelect) { + SendListMessage(LB_SETCARETINDEX, pos, FALSE); SendListMessage(LB_SETSEL, FALSE, pos); } else { --- /dev/null 2016-03-18 10:45:29.027254000 +0530 +++ new/test/java/awt/List/ItemEventTest/ItemEventTest.java 2016-03-18 13:02:32.370970765 +0530 @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8033936 + * @summary Verify that correct ItemEvent is received while selection & + * deselection of multi select List items. + */ + +import java.awt.AWTException; +import java.awt.Event; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.List; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.event.InputEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +public class ItemEventTest extends Frame +{ + List list; + final String expectedSelectionOrder; + StringBuilder actualSelectionOrder; + Robot robot; + + public ItemEventTest() + { + try { + robot = new Robot(); + } catch(AWTException e) { + throw new RuntimeException(e.getMessage()); + } + expectedSelectionOrder = "01230123"; + + list = new List(4, true); + list.add("0"); + list.add("1"); + list.add("2"); + list.add("3"); + + add(list); + setSize(400,400); + setLayout(new FlowLayout()); + pack(); + setVisible(true); + robot.waitForIdle(); + } + + @Override + public boolean handleEvent(Event e) { + if (e.target instanceof List) { + if (e.id == Event.LIST_DESELECT || e.id == Event.LIST_SELECT) { + actualSelectionOrder.append(e.arg); + } + } + return true; + } + + void testHandleEvent() { + // When no ItemListener is added to List, parent's handleEvent is + // called with ItemEvent. + performTest(); + } + + void testItemListener() { + list.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent ie) { + actualSelectionOrder.append(ie.getItem()); + } + }); + performTest(); + } + + void performTest() { + actualSelectionOrder = new StringBuilder(); + Point loc = list.getLocationOnScreen(); + Rectangle rect = list.getBounds(); + int dY = rect.height / list.getItemCount(); + loc = new Point(loc.x + 10, loc.y + 5); + + String osName = System.getProperty("os.name"); + boolean isMac = osName.contains("Mac") || osName.contains("mac"); + if(isMac) { + robot.keyPress(KeyEvent.VK_META); + } + + // First loop to select & Second loop to deselect the list items. + for (int j = 0; j < 2; ++j) { + for (int i = 0; i < list.getItemCount(); ++i) { + robot.mouseMove(loc.x, loc.y + i * dY); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.delay(100); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + robot.waitForIdle(); + } + } + + if(isMac) { + robot.keyRelease(KeyEvent.VK_META); + } + + if (!expectedSelectionOrder.equals(actualSelectionOrder.toString())) { + dispose(); + throw new RuntimeException("ItemEvent for selection & deselection" + + " of multi select List's item is not correct" + + " Expected : " + expectedSelectionOrder + + " Actual : " + actualSelectionOrder); + } + } + + public static void main(String args[]) { + ItemEventTest test = new ItemEventTest(); + test.testHandleEvent(); + test.testItemListener(); + test.dispose(); + } +}