001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.gui.tagging;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.awt.Component;
007    import java.awt.event.ActionEvent;
008    import java.util.ArrayList;
009    import java.util.Collections;
010    
011    import javax.swing.Action;
012    import javax.swing.JMenu;
013    import javax.swing.JMenuItem;
014    import javax.swing.JPopupMenu;
015    import javax.swing.JSeparator;
016    
017    import org.openstreetmap.josm.tools.PresetTextComparator;
018    
019    public class TaggingPresetMenu extends TaggingPreset {
020        public JMenu menu = null; // set by TaggingPresetPreferences
021        public void setDisplayName() {
022            putValue(Action.NAME, getName());
023            /** Tooltips should be shown for the toolbar buttons, but not in the menu. */
024            putValue(OPTIONAL_TOOLTIP_TEXT, (group != null ?
025                    tr("Preset group {1} / {0}", getLocaleName(), group.getName()) :
026                        tr("Preset group {0}", getLocaleName())));
027            putValue("toolbar", "tagginggroup_" + getRawName());
028        }
029        public void setIcon(String iconName) {
030            super.setIcon(iconName);
031        }
032    
033        private Component copyMenuComponent(Component menuComponent) {
034            if (menuComponent instanceof JMenu) {
035                JMenu menu = (JMenu)menuComponent;
036                JMenu result = new JMenu(menu.getAction());
037                for (Component item:menu.getMenuComponents()) {
038                    result.add(copyMenuComponent(item));
039                }
040                result.setText(menu.getText());
041                return result;
042            } else if (menuComponent instanceof JMenuItem) {
043                JMenuItem menuItem = (JMenuItem)menuComponent;
044                JMenuItem result = new JMenuItem(menuItem.getAction());
045                result.setText(menuItem.getText());
046                return result;
047            } else if(menuComponent instanceof JSeparator) {
048                return new JSeparator();
049            } else {
050                return menuComponent;
051            }
052        }
053    
054        public void actionPerformed(ActionEvent e) {
055            Object s = e.getSource();
056            if(menu != null && s instanceof Component)
057            {
058                Component co = (Component)s;
059                JPopupMenu pm = new JPopupMenu(getName());
060                for (Component c : menu.getMenuComponents()) {
061                    pm.add(copyMenuComponent(c));
062                }
063                pm.show(co, co.getWidth()/2, co.getHeight()/2);
064            }
065        }
066        /**
067         * Sorts the menu items using the translated item text
068         */
069        public void sortMenu(){
070            TaggingPresetMenu.sortMenu(this.menu);
071        }
072    
073        /**
074         * Sorts the menu items using the translated item text
075         */
076        public static void sortMenu(JMenu menu){
077            Component[] items = menu.getMenuComponents();
078            PresetTextComparator comp = new PresetTextComparator();
079            ArrayList<JMenuItem> sortarray = new ArrayList<JMenuItem>();
080            int lastSeparator = 0;
081            for (int i = 0; i < items.length; i++) {
082                Object item = items[i];
083                if (item instanceof JMenu){
084                    sortMenu((JMenu)item);
085                }
086                if (item instanceof JMenuItem){
087                    sortarray.add((JMenuItem)item);
088                    if (i == items.length-1){
089                        Collections.sort(sortarray, comp);
090                        int pos = 0;
091                        for (JMenuItem menuItem : sortarray) {
092                            int oldPos;
093                            if(lastSeparator == 0){
094                                oldPos=pos;
095                            }else {
096                                oldPos = pos+lastSeparator+1;
097                            }
098                            menu.add(menuItem, oldPos);
099                            pos++;
100                        }
101                        sortarray = new ArrayList<JMenuItem>();
102                        lastSeparator = 0;
103                    }
104                }else if (item instanceof JSeparator){
105                    Collections.sort(sortarray, comp);
106                    int pos = 0;
107                    for (JMenuItem menuItem : sortarray) {
108                        int oldPos;
109                        if(lastSeparator == 0){
110                            oldPos=pos;
111                        }else {
112                            oldPos = pos+lastSeparator+1;
113                        }
114                        menu.add(menuItem, oldPos);
115                        pos++;
116                    }
117                    sortarray = new ArrayList<JMenuItem>();
118                    lastSeparator = i;
119                }
120            }
121        }
122    }