/* * @(#)BasicJidePopupMenuUI.java 12/13/2006 * * Copyright 2002 - 2006 JIDE Software Inc. All rights reserved. */ package com.jidesoft.plaf.basic; import com.jidesoft.swing.JidePopupMenu; import com.jidesoft.swing.SimpleScrollPane; import com.jidesoft.utils.SystemInfo; import javax.swing.*; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicPopupMenuUI; import javax.swing.plaf.basic.DefaultMenuLayout; import java.awt.*; public class BasicJidePopupMenuUI extends BasicPopupMenuUI { public BasicJidePopupMenuUI() { } @SuppressWarnings({"UnusedDeclaration"}) public static ComponentUI createUI(JComponent c) { return new BasicJidePopupMenuUI(); } @Override public Popup getPopup(JPopupMenu popupMenu, int x, int y) { Popup popup = BasicJidePopupMenuUI.addScrollPaneIfNecessary(popupMenu, x, y); return popup == null ? super.getPopup(popupMenu, x, y) : popup; } /** * Adds a scroll pane to the popup menu if the popup menu is taller than the screen boundary. * * @param popupMenu the popup menu. * @param x the x origin * @param y the y origin * @return Popup */ public static Popup addScrollPaneIfNecessary(final JPopupMenu popupMenu, int x, int y) { final SimpleScrollPane contents = new SimpleScrollPane(popupMenu, SimpleScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, SimpleScrollPane.HORIZONTAL_SCROLLBAR_NEVER); if (popupMenu instanceof JidePopupMenu && popupMenu.getPreferredSize().height != ((JidePopupMenu) popupMenu).getPreferredScrollableViewportSize().height) { if (popupMenu.getLayout() instanceof DefaultMenuLayout && SystemInfo.isJdk6Above()) { popupMenu.setLayout(new BoxLayout(popupMenu, ((DefaultMenuLayout) popupMenu.getLayout()).getAxis())); } PopupFactory popupFactory = PopupFactory.getSharedInstance(); contents.getScrollUpButton().setOpaque(true); contents.getScrollDownButton().setOpaque(true); contents.setBorder(BorderFactory.createEmptyBorder()); Component[] components = popupMenu.getComponents(); for (Component component : components) { if (component instanceof JMenuItem) { ((JMenuItem) component).addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (e.getSource() instanceof JMenuItem) { if (((JMenuItem) e.getSource()).getModel().isArmed()) { popupMenu.scrollRectToVisible(((JMenuItem) e.getSource()).getBounds()); Point position = contents.getViewport().getViewPosition(); contents.getScrollUpButton().setEnabled(position.y > 2); contents.getScrollDownButton().setEnabled(position.y < contents.getViewport().getViewSize().height - contents.getViewport().getViewRect().height - 2); } } } }); } } return popupFactory.getPopup(popupMenu.getInvoker(), contents, x, y); } else { return null; } } }