/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package photoSpreadUtilities; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Iterator; import java.util.TreeSet; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.event.MouseInputAdapter; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import photoSpreadTable.PhotoSpreadCell; /** * * @author skandel */ public class PhotoSpreadContextMenu extends JPopupMenu { private static final long serialVersionUID = 1L; MouseListener _popupListener; PhotoSpreadCell _displayedCell; static String _currentMetadataSortKey = ""; /**************************************************** * Constructor(s) *****************************************************/ public PhotoSpreadContextMenu(){ this(null); } public PhotoSpreadContextMenu(PhotoSpreadCell cell){ _displayedCell = cell; _popupListener = new PopupListener(); this.addPopupMenuListener((PopupMenuListener) _popupListener); // We force this popup menu to be // medium- or heavyweight, because // otherwise the OsmoticGlassPane // cannot 'see' the popup menu and // therefore won't properly forward // mouse events to the menu. This might // be obsolete, because the OsmoticGlassPane // has been re-engineered. But I don't // have time to test whether this statement // can go away: this.setLightWeightPopupEnabled(false); } public static String getCurrentMetadataSortKey () { return _currentMetadataSortKey; } public static void setCurrentMetadataSortKey (String key) { if (key == null) _currentMetadataSortKey = ""; else _currentMetadataSortKey = key; } /**************************************************** * Methods *****************************************************/ public MouseListener getPopupListener(){ return _popupListener; } public JMenuItem addMenuItem(String menuLabel, ActionListener listener ){ JMenuItem menuItem = new JMenuItem(menuLabel); menuItem.addActionListener(listener); this.add(menuItem); return menuItem; } public void addMenuItemSeparator() { this.addSeparator(); } /* public void addMenuItem(String menuLabel, PhotoSpreadContextMenu submenu) { JMenuItem menuItem = new JMenuItem(menuLabel); this.add(menuItem); } */ /**************************************************** * PhotoSpreadSubmenu Inner Class *****************************************************/ public static class PhotoSpreadSubMenu extends JMenu { private static final long serialVersionUID = 1L; public PhotoSpreadSubMenu (String label) { super(label); } public JMenuItem addMenuItem(String menuLabel, ActionListener listener ){ JMenuItem menuItem = new JMenuItem(menuLabel); menuItem.addActionListener(listener); this.add(menuItem); return menuItem; } public JMenuItem addMenuItemSubMenu(JMenu subMenu, ActionListener listener ){ subMenu.addActionListener(listener); this.add(subMenu); return subMenu; } } /**************************************************** * PhotoSpreadRadioButtonSubMenu Inner Class *****************************************************/ public static class PhotoSpreadRadioButtonSubMenu extends JMenu { private static final long serialVersionUID = 1L; private JButtonGroup _buttonGroup; private PhotoSpreadCell _displayedCell; public PhotoSpreadRadioButtonSubMenu (String menuLabel, PhotoSpreadCell cell) { super(menuLabel); _displayedCell = cell; _buttonGroup = new JButtonGroup(); this.addMouseListener(new AllSortKeysMenuItemMouseDragListener(this, _displayedCell)); } public JRadioButtonMenuItem addRadioButton (String menuLabel, ActionListener listener ){ JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(menuLabel); menuItem.addActionListener(listener); this.add(menuItem); _buttonGroup.add(menuItem); return menuItem; } public void removeAllButtons () { _buttonGroup = new JButtonGroup(); // Remove radio buttons from the radio sub menu: removeAll(); } public JButtonGroup getButtonGroup () { return _buttonGroup; } protected static void refreshMetadataKeysRadioButtonMenu (PhotoSpreadRadioButtonSubMenu rbMenu, final PhotoSpreadCell cell) { if (cell == null) return; rbMenu.removeAllButtons(); TreeSet<String> allMetadataKeys = cell.getAllMetadataKeys (); Iterator<String> it = allMetadataKeys.iterator(); if (!it.hasNext()) { rbMenu.addRadioButton( "No objects to sort in cell " + cell.getCellAddress() + ".", null); return; } while (it.hasNext()) { rbMenu.addRadioButton( it.next(), new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { _currentMetadataSortKey = e.getActionCommand(); cell.sortObjects(e.getActionCommand()); } }); }; } } /**************************************************** * PopupListener Inner Class *****************************************************/ class PopupListener extends MouseInputAdapter implements PopupMenuListener { public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { PhotoSpreadContextMenu.this.show(e.getComponent(), e.getX(), e.getY()); } } public void mouseExited (MouseEvent mouseEnteredEvent) { } @Override public void popupMenuCanceled(PopupMenuEvent e) { } @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { AllSortKeysMenuItemMouseDragListener.setCouldBeDirty(true); } @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { } } /**************************************************** * AllSortKeysMenuItemFocusListener Inner Class *****************************************************/ static class AllSortKeysMenuItemMouseDragListener extends MouseInputAdapter { static boolean _couldBeDirty = true; PhotoSpreadRadioButtonSubMenu _allKeysRBMenu; PhotoSpreadCell _displayedCell; public AllSortKeysMenuItemMouseDragListener(PhotoSpreadRadioButtonSubMenu menu, PhotoSpreadCell cell) { _allKeysRBMenu = menu; _displayedCell = cell; } public static void setCouldBeDirty (boolean value) { _couldBeDirty = value; } @Override public void mouseEntered(MouseEvent mouseEnteredEvent) { // System.out.println("Submenu entered. _couldBeDirty: " + _couldBeDirty); if (!_couldBeDirty) return; PhotoSpreadRadioButtonSubMenu.refreshMetadataKeysRadioButtonMenu (_allKeysRBMenu, _displayedCell); _couldBeDirty = false; } } }