// License: GPL. Copyright 2007 by Immanuel Scholz and others
package org.openstreetmap.josm.gui.tagging;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import org.openstreetmap.josm.tools.PresetTextComparator;
public class TaggingPresetMenu extends TaggingPreset {
public JMenu menu = null; // set by TaggingPresetPreferences
public void setDisplayName() {
putValue(Action.NAME, getName());
/** Tooltips should be shown for the toolbar buttons, but not in the menu. */
putValue(OPTIONAL_TOOLTIP_TEXT, (group != null ?
tr("Preset group {1} / {0}", getLocaleName(), group.getName()) :
tr("Preset group {0}", getLocaleName())));
putValue("toolbar", "tagginggroup_" + getRawName());
}
public void setIcon(String iconName) {
super.setIcon(iconName);
}
private Component copyMenuComponent(Component menuComponent) {
if (menuComponent instanceof JMenu) {
JMenu menu = (JMenu)menuComponent;
JMenu result = new JMenu(menu.getAction());
for (Component item:menu.getMenuComponents()) {
result.add(copyMenuComponent(item));
}
result.setText(menu.getText());
return result;
} else if (menuComponent instanceof JMenuItem) {
JMenuItem menuItem = (JMenuItem)menuComponent;
JMenuItem result = new JMenuItem(menuItem.getAction());
result.setText(menuItem.getText());
return result;
} else if(menuComponent instanceof JSeparator) {
return new JSeparator();
} else {
return menuComponent;
}
}
public void actionPerformed(ActionEvent e) {
Object s = e.getSource();
if(menu != null && s instanceof Component)
{
Component co = (Component)s;
JPopupMenu pm = new JPopupMenu(getName());
for(Component c : menu.getMenuComponents())
pm.add(copyMenuComponent(c));
{
}
pm.show(co, co.getWidth()/2, co.getHeight()/2);
}
}
/**
* Sorts the menu items using the translated item text
*/
public void sortMenu(){
TaggingPresetMenu.sortMenu(this.menu);
}
/**
* Sorts the menu items using the translated item text
*/
public static void sortMenu(JMenu menu){
Component[] items = menu.getMenuComponents();
PresetTextComparator comp = new PresetTextComparator();
ArrayList<JMenuItem> sortarray = new ArrayList<JMenuItem>();
int lastSeparator = 0;
for (int i = 0; i < items.length; i++) {
Object item = items[i];
if (item instanceof JMenu){
sortMenu((JMenu)item);
}
if (item instanceof JMenuItem){
sortarray.add((JMenuItem)item);
if (i == items.length-1){
Collections.sort(sortarray, comp);
int pos = 0;
for (JMenuItem menuItem : sortarray) {
int oldPos;
if(lastSeparator == 0){
oldPos=pos;
}else {
oldPos = pos+lastSeparator+1;
}
menu.add(menuItem, oldPos);
pos++;
}
sortarray = new ArrayList<JMenuItem>();
lastSeparator = 0;
}
}else if (item instanceof JSeparator){
Collections.sort(sortarray, comp);
int pos = 0;
for (JMenuItem menuItem : sortarray) {
int oldPos;
if(lastSeparator == 0){
oldPos=pos;
}else {
oldPos = pos+lastSeparator+1;
}
menu.add(menuItem, oldPos);
pos++;
}
sortarray = new ArrayList<JMenuItem>();
lastSeparator = i;
}
}
}
}