package org.zaproxy.zap.view;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import org.parosproxy.paros.Constant;
/**
* A {@code JMenuItem} that has an identifier, allows to define the default accelerator and uses a internationalised text and,
* optionally, a mnemonic, both read from resource files.
* <p>
* The use of this class is preferred to {@code JMenuItem} as it allows the user to configure its accelerator through the
* options dialogue. The identifier is used to save/load its configurations.
* <p>
* Example usage:
* <blockquote><pre>{@code
* // Obtain the system dependent accelerator modifier key
* int acceleratorModifierKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
* KeyStroke defaultAccelerator = KeyStroke.getKeyStroke(KeyEvent.VK_R, acceleratorModifierKey);
* ZapMenuItem menuItem = new ZapMenuItem("menu.report", defaultAccelerator);
* }</pre></blockquote>
* and in the resource file (e.g. Messages.properties) define the keys:
* <blockquote><pre>{@code
* menu.report = Report
* # Optionally define its mnemonic
* menu.report.mnemonic = R
* }</pre></blockquote>
*
* @since 2.3.0
*/
public class ZapMenuItem extends JMenuItem {
private static final long serialVersionUID = 1L;
private String identifier;
private KeyStroke defaultAccelerator;
/**
* Constructs a {@code ZapMenuItem} with the text for the menu obtained from the resource files (e.g. Messages.properties)
* using as key the parameter {@code i18nKey} and using the given {@code KeyStroke} as default accelerator (the user can
* override the accelerator through the configurations).
* <p>
* The parameter {@code i18nKey} is used as identifier (to save/load configurations, like its accelerator) and it will also
* be used to attempt to create its mnemonic, by using as key {@code <i18nKey>.mnemonic}. No mnemonic is set if the key does
* not exist in the resource files.
* <p>
* <strong>Note:</strong> This constructor is preferred to {@link #ZapMenuItem(String, String, KeyStroke)}, as it supports
* the (automatic) load of internationalised text and definition of the mnemonic.
*
* @param i18nKey the key used to read the internationalised text for the menu item and, optionally, its mnemonic
* @param defaultAccelerator the default accelerator for the menu item, might be {@code null}.
* @see #setMnemonic(int)
* @see #setAccelerator(KeyStroke)
* @throws NullPointerException if {@code i18nKey} is {@code null}.
*/
public ZapMenuItem(String i18nKey, KeyStroke defaultAccelerator) {
this(i18nKey, Constant.messages.getString(i18nKey), defaultAccelerator);
// This will handle missing i18n keys ok
this.setMnemonic(Constant.messages.getChar(i18nKey + ".mnemonic"));
}
/**
* Constructs a {@code ZapMenuItem} with the given {@code identifier}, {@code text} and default accelerator (user can
* override the accelerator through the configurations).
* <p>
* <strong>Note:</strong> The constructor {@link #ZapMenuItem(String, KeyStroke)} is preferred to this one, as it supports
* the (automatic) load of internationalised text and definition of the mnemonic.
*
* @param identifier the identifier for the menu item (used to save/load configurations), should not be {@code null}
* @param text the text shown in the menu item
* @param defaultAccelerator the default accelerator for the menu item, might be {@code null}
* @see #setMnemonic(int)
*/
public ZapMenuItem(String identifier, String text, KeyStroke defaultAccelerator) {
super(text);
this.identifier = identifier;
this.defaultAccelerator = defaultAccelerator;
if (defaultAccelerator != null) {
// Note that this can be overridden by the Keyboard extension
this.setAccelerator(defaultAccelerator);
}
}
/**
* Constructs a {@code ZapMenuItem} with the text for the menu obtained from the resources file (e.g. Messages.properties)
* using as key the given parameter and with no default accelerator.
* <p>
* The given parameter is used as identifier (to save/load configurations, like its accelerator) and it will also be used to
* attempt to create its mnemonic, by using as key {@code <i18nKey>.mnemonic}. No mnemonic is set if the key does not exist
* in the resource files.
*
* @param i18nKey the key used to read the internationalised text for the menu item and, optionally, its mnemonic
* @throws NullPointerException if {@code i18nKey} is {@code null}.
* @see ZapMenuItem#ZapMenuItem(String, KeyStroke)
* @see #setMnemonic(int)
*/
public ZapMenuItem(String i18nKey) {
this(i18nKey, null);
}
/**
* Gets the identifier of the menu item.
*
* @return the identifier, might be {@code null}
*/
public String getIdenfifier() {
return this.identifier;
}
/**
* Resets the accelerator to default value (which might be {@code null} thus just removing any accelerator previously set).
*
* @see #getDefaultAccelerator()
*/
public void resetAccelerator() {
this.setAccelerator(this.defaultAccelerator);
}
/**
* Gets the default accelerator, defined when the menu item was constructed.
*
* @return a {@code KeyStroke} with the default accelerator, might be {@code null}.
* @see #resetAccelerator()
*/
public KeyStroke getDefaultAccelerator() {
return defaultAccelerator;
}
}