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 }