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 }