/* * $Id$ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jdesktop.swingx.plaf; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ActionMap; import javax.swing.JComponent; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; /** * Responsible for showing the default PopupMenu. * * @author Jeanette Winzenburg */ public class ContextMenuHandler extends MouseAdapter { private ActionMap actionMap; private ContextMenuSource contextMenuSource; private JPopupMenu popup; /** * creates a context handler for TextContextMenuSource. * */ public ContextMenuHandler() { this(null); } /** * creates a context handler for the given ContextMenuSource. * Defaults to TextContextMenuSource if source == null. * * @param source */ public ContextMenuHandler(ContextMenuSource source) { contextMenuSource = source; } // --------------------- MouseListener public void mousePressed(MouseEvent e) { maybeShowContext(e); } public void mouseReleased(MouseEvent e) { maybeShowContext(e); } private void maybeShowContext(final MouseEvent e) { if (!e.isPopupTrigger() || !e.getComponent().isEnabled()) return; if (e.getComponent().hasFocus()) { showContextPopup(e); } else { ((JComponent) e.getComponent()).grabFocus(); SwingUtilities.invokeLater(new Runnable() { public void run() { showContextPopup(e); } }); } } private void showContextPopup(MouseEvent e) { showContextPopup((JComponent) e.getComponent(), e.getX(), e .getY()); } private void showContextPopup(JComponent component, int x, int y) { JPopupMenu popup = getPopupMenu(component, true); popup.show(component, x, y); } /** * @param component * @return */ private JPopupMenu getPopupMenu(JComponent component, boolean synchEnabled) { if (popup == null) { popup = new JPopupMenu(); ActionMap map = getActionMap(component); String[] keys = getContextMenuSource().getKeys(); for (int i = 0; i < keys.length; i++) { if (keys[i] != null) { popup.add(map.get(keys[i])); } else { popup.addSeparator(); } } } if (synchEnabled) { getContextMenuSource().updateActionEnabled(component, actionMap); } return popup; } private ActionMap getActionMap(JComponent component) { if (actionMap == null) { actionMap = getContextMenuSource().createActionMap(component); } else { // todo: replace actions with components? } return actionMap; } private ContextMenuSource getContextMenuSource() { if (contextMenuSource == null) { contextMenuSource = new TextContextMenuSource(); } return contextMenuSource; } }