001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.util;
017    
018    import java.awt.Dimension;
019    
020    import javax.swing.AbstractButton;
021    import javax.swing.JMenuItem;
022    import javax.swing.JPopupMenu;
023    import javax.swing.MenuElement;
024    
025    import org.springframework.richclient.image.EmptyIcon;
026    
027    public class MenuElementUtils {
028        private MenuElementUtils() {
029        }
030    
031        /**
032         * Return whether there are any icons at the moment.
033         * 
034         * @return whether there are any icons at the moment
035         */
036        private static boolean hasIcons(MenuElement menuElement) {
037            MenuElement[] elements = menuElement.getSubElements();
038            for (int i = 0; i < elements.length; i++) {
039                MenuElement element = elements[i];
040                if (element instanceof JMenuItem && (((JMenuItem)element).getIcon() != null)) {
041                    return true;
042                }
043                if (element instanceof JPopupMenu) {
044                    return hasIcons(element);
045                }
046            }
047            return false;
048        }
049    
050        /**
051         * Fill in icons (if there is no icon, put in an empty icon).
052         */
053        private static void fillInIcons(MenuElement menuElement) {
054            MenuElement[] elements = menuElement.getSubElements();
055            for (int i = 0; i < elements.length; i++) {
056                MenuElement element = elements[i];
057                if (element instanceof JMenuItem) {
058                    JMenuItem menu = (JMenuItem)element;
059                    if (menu.getIcon() == null) {
060                        menu.setIcon(EmptyIcon.SMALL);
061                    }
062                }
063                if (element instanceof JPopupMenu) {
064                    fillInIcons(element);
065                }
066            }
067        }
068    
069        /**
070         * Align the icons.
071         */
072        public static void alignIcons(MenuElement menuElement) {
073            // We fill in a blank icon to align the menu items
074            if (hasIcons(menuElement)) {
075                fillInIcons(menuElement);
076            }
077        }
078    
079        public static void showButtonPopupMenu(AbstractButton button, JPopupMenu popup) {
080            if (!popup.isVisible()) {
081                Dimension size = button.getSize();
082                popup.show(button, 0, size.height);
083            }
084        }
085    
086    }