package org.basex.gui.layout;
import static org.basex.gui.layout.BaseXKeys.*;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import org.basex.gui.GUI;
import org.basex.gui.GUICommand;
/**
* Project specific Popup menu implementation.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
* @author Lukas Kircher
*/
public final class BaseXPopup extends JPopupMenu {
/** Reference to main window. */
final GUI gui;
/** Popup reference. */
private final GUICommand[] popup;
/**
* Constructor.
* @param comp component reference
* @param pop popup reference
*/
public BaseXPopup(final BaseXPanel comp, final GUICommand... pop) {
this(comp, comp.gui, pop);
}
/**
* Constructor.
* @param comp component reference
* @param g gui reference
* @param pop popup reference
*/
public BaseXPopup(final JComponent comp, final GUI g,
final GUICommand... pop) {
popup = pop;
gui = g;
// both listeners must be implemented to support different platforms
comp.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent e) {
if(!gui.updating && e.isPopupTrigger())
show(e.getComponent(), e.getX() - 10, e.getY() - 15);
}
@Override
public void mouseReleased(final MouseEvent e) {
mousePressed(e);
}
});
comp.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(final KeyEvent e) {
if(!gui.updating && CONTEXT.is(e)) show(e.getComponent(), 10, 10);
}
});
for(final GUICommand c : pop) {
if(c == null) {
addSeparator();
} else {
final JMenuItem item = add(c.label());
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if(!gui.updating) c.execute(gui);
}
});
item.setMnemonic(c.label().charAt(0));
item.setToolTipText(c.help());
}
}
}
@Override
public void show(final Component comp, final int x, final int y) {
for(int b = 0; b < popup.length; ++b) {
if(popup[b] != null) popup[b].refresh(gui, (JMenuItem) getComponent(b));
}
super.show(comp, x, y);
}
}