/* The code was developed by Jan Hakenberg in 2010-2014. * The file was released to public domain by the author. */ package amodeus.amodeus.util.gui; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; class SpinnerMenu<Type> extends StandardMenu { private final Map<Type, JMenuItem> map = new LinkedHashMap<>(); private final SpinnerLabel<Type> spinnerLabel; private final boolean hover; SpinnerMenu(SpinnerLabel<Type> spinnerLabel, boolean hover) { this.spinnerLabel = spinnerLabel; this.hover = hover; } @Override protected void design(JPopupMenu jPopupMenu) { for (Type type : spinnerLabel.list) { JMenuItem jMenuItem = new JMenuItem(type.toString()); if (hover) jMenuItem.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent myMouseEvent) { setValue(type); } }); jMenuItem.addActionListener(myActionEvent -> { if (!type.equals(spinnerLabel.getValue())) // invoke only when different setValue(type); }); map.put(type, jMenuItem); jPopupMenu.add(jMenuItem); } } private void setValue(Type type) { spinnerLabel.setValueSafe(type); spinnerLabel.reportToAll(); } public void showRight(JLabel jLabel) { JPopupMenu jPopupMenu = designAndGetJPopupMenu(); // --- Type type = spinnerLabel.getValue(); if (type != null) { int delta = 2; map.get(type).setBackground(Colors.ACTIVE_ITEM); // Colors.gold for (Entry<Type, JMenuItem> entry : map.entrySet()) { delta += entry.getValue().getPreferredSize().height; if (entry.getKey().equals(type)) { delta -= entry.getValue().getPreferredSize().height / 2; break; } } Dimension dimension = jLabel.getSize(); jPopupMenu.show(jLabel, dimension.width, dimension.height / 2 - delta); } } }