source: josm/trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetMenu.java@ 12042

Last change on this file since 12042 was 10619, checked in by Don-vip, 8 years ago

see #11390 - Java 8: use List.sort(Comparator) instead of Collections.sort(list, Comparator)

  • Property svn:eol-style set to native
File size: 5.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.tagging.presets;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.MouseInfo;
8import java.awt.Point;
9import java.awt.PointerInfo;
10import java.awt.event.ActionEvent;
11import java.io.Serializable;
12import java.util.ArrayList;
13import java.util.Comparator;
14import java.util.List;
15import java.util.Objects;
16
17import javax.swing.Action;
18import javax.swing.JMenu;
19import javax.swing.JMenuItem;
20import javax.swing.JPopupMenu;
21import javax.swing.JSeparator;
22
23import org.openstreetmap.josm.Main;
24import org.openstreetmap.josm.tools.AlphanumComparator;
25
26public class TaggingPresetMenu extends TaggingPreset {
27 public JMenu menu; // set by TaggingPresets
28
29 private static class PresetTextComparator implements Comparator<JMenuItem>, Serializable {
30 @Override
31 public int compare(JMenuItem o1, JMenuItem o2) {
32 if (Main.main.menu.presetSearchAction.equals(o1.getAction()))
33 return -1;
34 else if (Main.main.menu.presetSearchAction.equals(o2.getAction()))
35 return 1;
36 else
37 return AlphanumComparator.getInstance().compare(o1.getText(), o2.getText());
38 }
39 }
40
41 /**
42 * {@code TaggingPresetMenu} are considered equivalent if (and only if) their {@link #getRawName()} match.
43 */
44 @Override
45 public boolean equals(Object o) {
46 if (this == o) return true;
47 if (o == null || getClass() != o.getClass()) return false;
48 TaggingPresetMenu that = (TaggingPresetMenu) o;
49 return Objects.equals(getRawName(), that.getRawName());
50 }
51
52 @Override
53 public int hashCode() {
54 return Objects.hash(getRawName());
55 }
56
57 @Override
58 public void setDisplayName() {
59 putValue(Action.NAME, getName());
60 /** Tooltips should be shown for the toolbar buttons, but not in the menu. */
61 putValue(OPTIONAL_TOOLTIP_TEXT, group != null ?
62 tr("Preset group {1} / {0}", getLocaleName(), group.getName()) :
63 tr("Preset group {0}", getLocaleName()));
64 putValue("toolbar", "tagginggroup_" + getRawName());
65 }
66
67 private static Component copyMenuComponent(Component menuComponent) {
68 if (menuComponent instanceof JMenu) {
69 JMenu menu = (JMenu) menuComponent;
70 JMenu result = new JMenu(menu.getAction());
71 for (Component item:menu.getMenuComponents()) {
72 result.add(copyMenuComponent(item));
73 }
74 result.setText(menu.getText());
75 return result;
76 } else if (menuComponent instanceof JMenuItem) {
77 JMenuItem menuItem = (JMenuItem) menuComponent;
78 JMenuItem result = new JMenuItem(menuItem.getAction());
79 result.setText(menuItem.getText());
80 return result;
81 } else if (menuComponent instanceof JSeparator) {
82 return new JSeparator();
83 } else {
84 return menuComponent;
85 }
86 }
87
88 @Override
89 public void actionPerformed(ActionEvent e) {
90 Object s = e.getSource();
91 if (menu != null && s instanceof Component) {
92 JPopupMenu pm = new JPopupMenu(getName());
93 for (Component c : menu.getMenuComponents()) {
94 pm.add(copyMenuComponent(c));
95 }
96 PointerInfo pointerInfo = MouseInfo.getPointerInfo();
97 if (pointerInfo != null) {
98 Point p = pointerInfo.getLocation();
99 pm.show(Main.parent, p.x-Main.parent.getX(), p.y-Main.parent.getY());
100 }
101 }
102 }
103
104 /**
105 * Sorts the menu items using the translated item text
106 */
107 public void sortMenu() {
108 TaggingPresetMenu.sortMenu(this.menu);
109 }
110
111 /**
112 * Sorts the menu items using the translated item text
113 * @param menu menu to sort
114 */
115 public static void sortMenu(JMenu menu) {
116 Component[] items = menu.getMenuComponents();
117 PresetTextComparator comp = new PresetTextComparator();
118 List<JMenuItem> sortarray = new ArrayList<>();
119 int lastSeparator = 0;
120 for (int i = 0; i < items.length; i++) {
121 Object item = items[i];
122 if (item instanceof JMenu) {
123 sortMenu((JMenu) item);
124 }
125 if (item instanceof JMenuItem) {
126 sortarray.add((JMenuItem) item);
127 if (i == items.length-1) {
128 handleMenuItem(menu, comp, sortarray, lastSeparator);
129 sortarray = new ArrayList<>();
130 lastSeparator = 0;
131 }
132 } else if (item instanceof JSeparator) {
133 handleMenuItem(menu, comp, sortarray, lastSeparator);
134 sortarray = new ArrayList<>();
135 lastSeparator = i;
136 }
137 }
138 }
139
140 private static void handleMenuItem(JMenu menu, PresetTextComparator comp, List<JMenuItem> sortarray, int lastSeparator) {
141 sortarray.sort(comp);
142 int pos = 0;
143 for (JMenuItem menuItem : sortarray) {
144 int oldPos;
145 if (lastSeparator == 0) {
146 oldPos = pos;
147 } else {
148 oldPos = pos+lastSeparator+1;
149 }
150 menu.add(menuItem, oldPos);
151 pos++;
152 }
153 }
154}
Note: See TracBrowser for help on using the repository browser.