// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.gui.hexview;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import org.infinity.icon.Icons;
import tv.porst.jhexview.IMenuCreator;
import tv.porst.jhexview.JHexView;
/**
* Provides a basic popupmenu for the HexViewer components.
*/
public class MenuCreator implements IMenuCreator, ActionListener
{
private final JPopupMenu popup;
private final JMenuItem miUndo;
private final JMenuItem miRedo;
private final JMenuItem miCopy;
private final JMenuItem miPaste;
private final JMenuItem miSelectAll;
private final JHexView hexView;
public MenuCreator(JHexView hexView)
{
if (hexView == null) {
throw new NullPointerException("hexView is null");
}
this.hexView = hexView;
int ctrl = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
popup = new JPopupMenu();
miUndo = new JMenuItem("Undo", Icons.getIcon(Icons.ICON_UNDO_16));
miUndo.setMnemonic('u');
miUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ctrl));
miRedo = new JMenuItem("Redo", Icons.getIcon(Icons.ICON_REDO_16));
miRedo.setMnemonic('r');
miRedo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, ctrl));
miCopy = new JMenuItem("Copy", Icons.getIcon(Icons.ICON_COPY_16));
miCopy.setMnemonic('c');
miCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ctrl));
miPaste = new JMenuItem("Paste", Icons.getIcon(Icons.ICON_PASTE_16));
miPaste.setMnemonic('p');
miPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ctrl));
miSelectAll = new JMenuItem("Select All");
miSelectAll.setMnemonic('a');
miSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ctrl));
miUndo.addActionListener(this);
miRedo.addActionListener(this);
miCopy.addActionListener(this);
miPaste.addActionListener(this);
miSelectAll.addActionListener(this);
}
//--------------------- Begin Interface IMenuCreator ---------------------
@Override
public JPopupMenu createMenu(long offset)
{
// generating popup menu
popup.removeAll();
miUndo.setText(String.format("Undo %1$s", getHexView().getUndoPresentationName()));
miUndo.setEnabled(isUndoAvailable());
popup.add(miUndo);
miRedo.setEnabled(isRedoAvailable());
miRedo.setText(String.format("Redo %1$s", getHexView().getRedoPresentationName()));
popup.add(miRedo);
popup.addSeparator();
miCopy.setEnabled(isCopyAvailable());
popup.add(miCopy);
miPaste.setEnabled(isPasteAvailable());
popup.add(miPaste);
popup.add(miSelectAll);
return popup;
}
//--------------------- End Interface IMenuCreator ---------------------
//--------------------- Begin Interface ActionListener ---------------------
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == miUndo) {
getHexView().undo();
} else if (e.getSource() == miRedo) {
getHexView().redo();
} else if (e.getSource() == miCopy) {
getHexView().copy();
} else if (e.getSource() == miPaste) {
getHexView().paste();
} else if (e.getSource() == miSelectAll) {
getHexView().selectAll();
}
}
//--------------------- End Interface ActionListener ---------------------
/** Returns the parent JHexView component. */
public JHexView getHexView()
{
return hexView;
}
protected JPopupMenu getPopupMenu()
{
return popup;
}
private boolean isUndoAvailable()
{
return getHexView().canUndo();
}
private boolean isRedoAvailable()
{
return getHexView().canRedo();
}
private boolean isCopyAvailable()
{
return (getHexView().getSelectionLength() > 0);
}
private boolean isPasteAvailable()
{
return Toolkit.getDefaultToolkit().getSystemClipboard()
.isDataFlavorAvailable(DataFlavor.stringFlavor);
}
}