diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java
index 11b3f6c321..bac268c761 100644
--- a/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java
+++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java
@@ -58,4 +58,9 @@ public @interface ConfigItem
String enabledBy() default "";
String disabledBy() default "";
+
+ boolean parse() default false;
+
+ Class> clazz() default void.class;
+ String method() default "";
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java
index 9efc0fe2f4..a72d9be29a 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java
@@ -36,11 +36,15 @@ import java.awt.Rectangle;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -65,6 +69,7 @@ import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
+import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
@@ -426,6 +431,44 @@ public class ConfigPanel extends PluginPanel
});
}
+ private Boolean parse(ConfigItem item, String value)
+ {
+ try
+ {
+ Method parse = item.clazz().getMethod(item.method(), String.class);
+ boolean result = (boolean) parse.invoke(null, value);
+
+ return result;
+ }
+ catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex)
+ {
+ log.error("Parsing failed: {}", ex.getMessage());
+ }
+
+ return null;
+ }
+
+ private void parseLabel(ConfigItem item, JLabel label, String value)
+ {
+ Boolean result = parse(item, value);
+
+ if (result == null)
+ {
+ label.setForeground(Color.RED);
+ label.setText("Parsing failed");
+ }
+ else if (result)
+ {
+ label.setForeground(Color.GREEN);
+ label.setText("Valid input");
+ }
+ else
+ {
+ label.setForeground(Color.RED);
+ label.setText("Error: Invalid input");
+ }
+ }
+
void openGroupConfigPanel(PluginListItem listItem, Config config, ConfigDescriptor cd)
{
showingPluginList = false;
@@ -586,7 +629,7 @@ public class ConfigPanel extends PluginPanel
configEntryName.setPreferredSize(new Dimension(PANEL_WIDTH, (int) configEntryName.getPreferredSize().getHeight()));
configEntryName.setForeground(Color.WHITE);
configEntryName.setToolTipText("" + name + ":
" + cid.getItem().description() + "");
- item.add(configEntryName, BorderLayout.CENTER);
+ item.add(configEntryName, cid.getType() != String.class ? BorderLayout.CENTER : BorderLayout.NORTH);
if (cid.getType() == Stub.class)
{
@@ -595,6 +638,7 @@ public class ConfigPanel extends PluginPanel
item.setBorder(new CompoundBorder(border, margin));
configEntryName.setForeground(Color.ORANGE);
+ configEntryName.setToolTipText(null);
}
if (cid.getType() == boolean.class)
@@ -676,11 +720,51 @@ public class ConfigPanel extends PluginPanel
@Override
public void focusLost(FocusEvent e)
{
- changeConfiguration(listItem, config, textField, cd, cid);
+ ConfigItem item = cid.getItem();
+ if (item.parse())
+ {
+ Boolean result = parse(item, textField.getText());
+
+ if (result != null && result)
+ {
+ changeConfiguration(listItem, config, textField, cd, cid);
+ }
+ }
+ else
+ {
+ changeConfiguration(listItem, config, textField, cd, cid);
+ }
}
});
- item.add(textField, BorderLayout.SOUTH);
+
+ if (cid.getItem().parse())
+ {
+ JLabel parsingLabel = new JLabel();
+ parsingLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ parsingLabel.setPreferredSize(new Dimension(PANEL_WIDTH, 15));
+
+ textField.addKeyListener(new KeyAdapter()
+ {
+ public void keyReleased(KeyEvent e)
+ {
+ ConfigItem item = cid.getItem();
+ if (item.parse())
+ {
+ parseLabel(item, parsingLabel, textField.getText());
+ }
+ }
+ });
+
+ item.add(textField, BorderLayout.CENTER);
+
+ parseLabel(cid.getItem(), parsingLabel, textField.getText());
+ item.add(parsingLabel, BorderLayout.SOUTH);
+ }
+ else
+ {
+ item.add(textField, BorderLayout.SOUTH);
+ }
}
if (cid.getType() == Color.class)
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java
index 89fa0b00ca..158b527adf 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java
@@ -301,7 +301,10 @@ public interface MenuEntrySwapperConfig extends Config
name = "Custom Swaps",
description = "Add custom swaps here, 1 per line. Syntax: option, target : option, target
Note that the first entry should be the left click one!",
position = 19,
- group = "Miscellaneous"
+ group = "Miscellaneous",
+ parse = true,
+ clazz = Parse.class,
+ method = "parse"
)
default String customSwaps()
{
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java
index dac44aa31b..3689c9c67d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java
@@ -1155,16 +1155,7 @@ public class MenuEntrySwapperPlugin extends Plugin
if (!Strings.isNullOrEmpty(config))
{
- Map split;
-
- try
- {
- split = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(config);
- }
- catch (IllegalArgumentException ex)
- {
- return;
- }
+ Map split = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(config);
for (Map.Entry entry : split.entrySet())
{
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java
new file mode 100644
index 0000000000..75a225589c
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/Parse.java
@@ -0,0 +1,24 @@
+package net.runelite.client.plugins.menuentryswapper;
+
+import com.google.common.base.Splitter;
+
+public class Parse
+{
+ public static boolean parse(String value)
+ {
+ try
+ {
+ Splitter NEWLINE_SPLITTER = Splitter
+ .on("\n")
+ .omitEmptyStrings()
+ .trimResults();
+
+ NEWLINE_SPLITTER.withKeyValueSeparator(':').split(value);
+ return true;
+ }
+ catch (IllegalArgumentException ex)
+ {
+ return false;
+ }
+ }
+}