Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8268084: [macos] Disabled JMenuItem arrow is not disabled #5310

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import com.apple.laf.AquaUtils.RecyclableSingleton;
import sun.awt.image.MultiResolutionCachedImage;
import sun.lwawt.macosx.CImage;
import sun.swing.ImageIconUIResource;

public class AquaImageFactory {
public static IconUIResource getConfirmImageIcon() {
Expand Down Expand Up @@ -231,10 +232,24 @@ protected IconUIResource getInstance() {
@SuppressWarnings("serial") // Superclass is not serializable across versions
static class InvertableImageIcon extends ImageIcon implements InvertableIcon, UIResource {
Icon invertedImage;
Icon disabledIcon;
prsadhuk marked this conversation as resolved.
Show resolved Hide resolved
public InvertableImageIcon(final Image image) {
super(image);
}

@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
if (!c.isEnabled()) {
if (disabledIcon == null) {
disabledIcon = new ImageIconUIResource(GrayFilter.
prsadhuk marked this conversation as resolved.
Show resolved Hide resolved
createDisabledImage(((ImageIcon)this).getImage()));
}
disabledIcon.paintIcon(c, g, x, y);
} else {
super.paintIcon(c, g, x, y);
}
}

@Override
public Icon getInvertedIcon() {
prsadhuk marked this conversation as resolved.
Show resolved Hide resolved
if (invertedImage != null) return invertedImage;
Expand Down
170 changes: 170 additions & 0 deletions test/jdk/javax/swing/plaf/aqua/JMenuItemDisableArrowButtonTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
/*
* Copyright (c) 2021, 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
* @requires (os.family == "mac")
* @bug 8268084
* @summary Verifies disabled JMenuItem arrow is disabled
prsadhuk marked this conversation as resolved.
Show resolved Hide resolved
* @run main/manual JMenuItemDisableArrowButtonTest
*/
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class JMenuItemDisableArrowButtonTest {

private static JFrame frame;
private static volatile CountDownLatch countDownLatch;
private static volatile boolean testResult;

private static final String INSTRUCTIONS = "INSTRUCTIONS:\n\n"
+ "Click on \"SubMenuTest\" menu.\n "
+ "If arrow icon is disabled along with \"Submenu\" menuitem\n"
+ "and\n"
+ "If checkmark icon is disabled along with \"Submenu\" CheckBox menuitem\n"
+ "then press Pass \n"
+ "otherwise if arrow or checkmark icon is not disabled, press Fail.";

public static void main(String args[]) throws Exception{
countDownLatch = new CountDownLatch(1);

SwingUtilities.invokeAndWait(JMenuItemDisableArrowButtonTest::createUI);
countDownLatch.await(5, TimeUnit.MINUTES);

if (!testResult) {
throw new RuntimeException(
"Disabled JMenuItem arrow or checkmark icon is not disabled!");
}
}

private static void createUI() {
try {
UIManager.setLookAndFeel("com.apple.laf.AquaLookAndFeel");
} catch (Exception e) {
throw new RuntimeException("Cannot initialize Aqua L&F");
}

JFrame mainFrame = new JFrame();
GridBagLayout layout = new GridBagLayout();
JPanel mainControlPanel = new JPanel(layout);
JPanel resultButtonPanel = new JPanel(layout);

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(5, 15, 5, 15);
gbc.fill = GridBagConstraints.HORIZONTAL;
mainControlPanel.add(createComponent(), gbc);

JTextArea instructionTextArea = new JTextArea();
instructionTextArea.setText(INSTRUCTIONS);
instructionTextArea.setEditable(false);
instructionTextArea.setBackground(Color.white);

gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
mainControlPanel.add(instructionTextArea, gbc);

JButton passButton = new JButton("Pass");
passButton.setActionCommand("Pass");
passButton.addActionListener((ActionEvent e) -> {
testResult = true;
mainFrame.dispose();
countDownLatch.countDown();

});

JButton failButton = new JButton("Fail");
failButton.setActionCommand("Fail");
failButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainFrame.dispose();
countDownLatch.countDown();
}
});

gbc.gridx = 0;
gbc.gridy = 0;

resultButtonPanel.add(passButton, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
resultButtonPanel.add(failButton, gbc);

gbc.gridx = 0;
gbc.gridy = 2;
mainControlPanel.add(resultButtonPanel, gbc);

mainFrame.add(mainControlPanel);
mainFrame.pack();

mainFrame.addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(WindowEvent e) {
mainFrame.dispose();
countDownLatch.countDown();
}
});
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
}

private static JComponent createComponent() {
final JMenuBar menuBar = new JMenuBar();
JMenu subMenuTestmenu = new JMenu("SubMenuTest");
JMenu disabledSubmenu = new JMenu("Submenu");
disabledSubmenu.setEnabled(false);
subMenuTestmenu.add(disabledSubmenu);

JCheckBoxMenuItem myItem = new JCheckBoxMenuItem("Submenu");
myItem.setSelected(true);
myItem.setEnabled(false);
subMenuTestmenu.add(myItem);

menuBar.add(subMenuTestmenu);
return menuBar;
}
}