*
* The MIT License (MIT)
*
- * Copyright (C) 2017 Kevin Lamonte
+ * Copyright (C) 2019 Kevin Lamonte
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
import jexer.bits.CellAttributes;
import jexer.bits.GraphicsChars;
import jexer.bits.MnemonicString;
+import jexer.bits.StringUtils;
import jexer.event.TKeypressEvent;
import jexer.event.TMouseEvent;
import jexer.event.TMenuEvent;
*/
private MnemonicString mnemonic;
+ /**
+ * An optional 2-cell-wide picture/icon for this item.
+ */
+ private int icon = -1;
+
// ------------------------------------------------------------------------
// Constructors -----------------------------------------------------------
// ------------------------------------------------------------------------
TMenuItem(final TMenu parent, final int id, final int x, final int y,
final String label) {
+ this(parent, id, x, y, label, -1);
+ }
+
+ /**
+ * Package private constructor.
+ *
+ * @param parent parent widget
+ * @param id menu id
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param label menu item title
+ * @param icon icon picture/emoji
+ */
+ TMenuItem(final TMenu parent, final int id, final int x, final int y,
+ final String label, final int icon) {
+
// Set parent and window
super(parent);
setY(y);
setHeight(1);
this.label = mnemonic.getRawLabel();
- setWidth(label.length() + 4);
+ if (parent.useIcons) {
+ setWidth(StringUtils.width(label) + 6);
+ } else {
+ setWidth(StringUtils.width(label) + 4);
+ }
this.id = id;
+ this.icon = icon;
// Default state for some known menu items
switch (id) {
}
}
+ boolean useIcons = ((TMenu) getParent()).useIcons;
+
char cVSide = GraphicsChars.WINDOW_SIDE;
- getScreen().vLineXY(0, 0, 1, cVSide, background);
- getScreen().vLineXY(getWidth() - 1, 0, 1, cVSide, background);
+ vLineXY(0, 0, 1, cVSide, background);
+ vLineXY(getWidth() - 1, 0, 1, cVSide, background);
- getScreen().hLineXY(1, 0, getWidth() - 2, ' ', menuColor);
- getScreen().putStringXY(2, 0, mnemonic.getRawLabel(), menuColor);
+ hLineXY(1, 0, getWidth() - 2, ' ', menuColor);
+ putStringXY(2 + (useIcons ? 2 : 0), 0, mnemonic.getRawLabel(),
+ menuColor);
if (key != null) {
String keyLabel = key.toString();
- getScreen().putStringXY((getWidth() - keyLabel.length() - 2), 0,
+ putStringXY((getWidth() - StringUtils.width(keyLabel) - 2), 0,
keyLabel, menuColor);
}
- if (mnemonic.getShortcutIdx() >= 0) {
- getScreen().putCharXY(2 + mnemonic.getShortcutIdx(), 0,
- mnemonic.getShortcut(), menuMnemonicColor);
+ if (mnemonic.getScreenShortcutIdx() >= 0) {
+ putCharXY(2 + (useIcons ? 2 : 0) + mnemonic.getScreenShortcutIdx(),
+ 0, mnemonic.getShortcut(), menuMnemonicColor);
}
if (checked) {
assert (checkable);
- getScreen().putCharXY(1, 0, GraphicsChars.CHECK, menuColor);
+ putCharXY(1, 0, GraphicsChars.CHECK, menuColor);
+ }
+ if ((useIcons == true) && (icon != -1)) {
+ putCharXY(2, 0, icon, menuColor);
}
-
}
// ------------------------------------------------------------------------
this.checkable = checkable;
}
+ /**
+ * Get checkable flag.
+ *
+ * @return true if this menu item is both checkable and checked
+ */
+ public final boolean getChecked() {
+ return ((checkable == true) && (checked == true));
+ }
+
+ /**
+ * Set checked flag. Note that setting checked on an item checkable will
+ * do nothing.
+ *
+ * @param checked if true, and if this menu item is checkable, then
+ * getChecked() will return true
+ */
+ public final void setChecked(final boolean checked) {
+ if (checkable) {
+ this.checked = checked;
+ } else {
+ this.checked = false;
+ }
+ }
+
/**
* Get the mnemonic string for this menu item.
*
this.key = key;
if (key != null) {
- int newWidth = (label.length() + 4 + key.toString().length() + 2);
+ int newWidth = (StringUtils.width(label) + 4 +
+ StringUtils.width(key.toString()) + 2);
+ if (((TMenu) getParent()).useIcons) {
+ newWidth += 2;
+ }
if (newWidth > getWidth()) {
setWidth(newWidth);
}
}
}
+ /**
+ * Get a picture/emoji icon for this menu item.
+ *
+ * @return the codepoint, or -1 if no icon is specified for this menu
+ * item
+ */
+ public final int getIcon() {
+ return icon;
+ }
+
+ /**
+ * Set a picture/emoji icon for this menu item.
+ *
+ * @param icon a codepoint, or -1 to unset the icon
+ */
+ public final void setIcon(final int icon) {
+ this.icon = icon;
+ }
+
/**
* Dispatch event(s) due to selection or click.
*/