From 5a286d58e740f1aa5944488c602f5abc1318f6ca Mon Sep 17 00:00:00 2001 From: 2xsaiko Date: Wed, 3 Jun 2020 20:16:10 +0200 Subject: Editor tabs (#238) * Split into modules * Add validation utils from patch-1 branch * Tabs, iteration 1 * Delete RefreshMode * Load initial code asynchronously * Formatting * Don't do anything when close() gets called multiple times * Add scroll pane to editor * Fix getActiveEditor() * Rename components to more descriptive editorScrollPanes * Move ClassHandle and related types out of gui package * Fix tab title bar and other files not updating when changing mappings * Fix compilation errors * Start adding renaming functionality to new panel * Scale validation error marker * Make most user input validation use ValidationContext * Fix line numbers not displaying * Move CodeReader.navigateToToken into PanelEditor * Add close button on tabs * Remove TODO, it's fast enough * Remove JS script action for 2 seconds faster startup * Add comment on why the action is removed * ClassHandle/ClassHandleProvider documentation * Fix language file formatting * Bulk tab closing operations * Fix crash when renaming class and not connected to server * Fix caret jumping to the end of the file when opening * Increase identifier panel size * Make popup menu text translatable * Fix formatting * Fix compilation issues * CovertTextField -> ConvertingTextField * Retain formatting using spaces * Add de_de.json * Better decompilation error handling * Fix some caret related NPEs * Localization * Close editor on classhandle delete & fix onInvalidate not running on the Swing thread * Fix crash when trying to close a tab from onDeleted class handle listener Co-authored-by: Runemoro --- .../cuchaz/enigma/network/ClientPacketHandler.java | 9 +++++---- .../enigma/network/packet/ChangeDocsC2SPacket.java | 18 ++++++++++++------ .../enigma/network/packet/ChangeDocsS2CPacket.java | 17 ++++++++++++----- .../network/packet/MarkDeobfuscatedC2SPacket.java | 22 +++++++++++++++------- .../network/packet/MarkDeobfuscatedS2CPacket.java | 17 ++++++++++++----- .../network/packet/RemoveMappingC2SPacket.java | 21 +++++++++++---------- .../network/packet/RemoveMappingS2CPacket.java | 17 ++++++++++++----- .../enigma/network/packet/RenameC2SPacket.java | 21 +++++++++++---------- .../enigma/network/packet/RenameS2CPacket.java | 17 ++++++++++++----- 9 files changed, 102 insertions(+), 57 deletions(-) (limited to 'enigma-server') diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/ClientPacketHandler.java b/enigma-server/src/main/java/cuchaz/enigma/network/ClientPacketHandler.java index 720744b..1b0191b 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/ClientPacketHandler.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/ClientPacketHandler.java @@ -5,19 +5,20 @@ import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.mapping.tree.EntryTree; import cuchaz.enigma.network.packet.Packet; import cuchaz.enigma.translation.representation.entry.Entry; +import cuchaz.enigma.utils.validation.ValidationContext; import java.util.List; public interface ClientPacketHandler { void openMappings(EntryTree mappings); - void rename(EntryReference, Entry> reference, String newName, boolean refreshClassTree, boolean jumpToReference); + void rename(ValidationContext vc, EntryReference, Entry> reference, String newName, boolean refreshClassTree); - void removeMapping(EntryReference, Entry> reference, boolean jumpToReference); + void removeMapping(ValidationContext vc, EntryReference, Entry> reference); - void changeDocs(EntryReference, Entry> reference, String updatedDocs, boolean jumpToReference); + void changeDocs(ValidationContext vc, EntryReference, Entry> reference, String updatedDocs); - void markAsDeobfuscated(EntryReference, Entry> reference, boolean jumpToReference); + void markAsDeobfuscated(ValidationContext vc, EntryReference, Entry> reference); void disconnectIfConnected(String reason); diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsC2SPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsC2SPacket.java index 1b52cf1..23ffe99 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsC2SPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsC2SPacket.java @@ -1,15 +1,17 @@ package cuchaz.enigma.network.packet; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.network.EnigmaServer; import cuchaz.enigma.network.Message; import cuchaz.enigma.network.ServerPacketHandler; import cuchaz.enigma.translation.representation.entry.Entry; import cuchaz.enigma.utils.Utils; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; public class ChangeDocsC2SPacket implements Packet { private Entry entry; @@ -37,6 +39,9 @@ public class ChangeDocsC2SPacket implements Packet { @Override public void handle(ServerPacketHandler handler) { + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + EntryMapping mapping = handler.getServer().getMappings().getDeobfMapping(entry); boolean valid = handler.getServer().canModifyEntry(handler.getClient(), entry); @@ -49,11 +54,12 @@ public class ChangeDocsC2SPacket implements Packet { if (mapping == null) { mapping = new EntryMapping(handler.getServer().getMappings().deobfuscate(entry).getName()); } - handler.getServer().getMappings().mapFromObf(entry, mapping.withDocs(Utils.isBlank(newDocs) ? null : newDocs)); + handler.getServer().getMappings().mapFromObf(vc, entry, mapping.withDocs(Utils.isBlank(newDocs) ? null : newDocs)); + + if (!vc.canProceed()) return; int syncId = handler.getServer().lockEntry(handler.getClient(), entry); handler.getServer().sendToAllExcept(handler.getClient(), new ChangeDocsS2CPacket(syncId, entry, newDocs)); handler.getServer().sendMessage(Message.editDocs(handler.getServer().getUsername(handler.getClient()), entry)); } - } diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsS2CPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsS2CPacket.java index 12a3025..78fa4fa 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsS2CPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/ChangeDocsS2CPacket.java @@ -1,13 +1,15 @@ package cuchaz.enigma.network.packet; -import cuchaz.enigma.analysis.EntryReference; -import cuchaz.enigma.network.ClientPacketHandler; -import cuchaz.enigma.translation.representation.entry.Entry; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import cuchaz.enigma.analysis.EntryReference; +import cuchaz.enigma.network.ClientPacketHandler; +import cuchaz.enigma.translation.representation.entry.Entry; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; + public class ChangeDocsS2CPacket implements Packet { private int syncId; private Entry entry; @@ -38,7 +40,12 @@ public class ChangeDocsS2CPacket implements Packet { @Override public void handle(ClientPacketHandler controller) { - controller.changeDocs(new EntryReference<>(entry, entry.getName()), newDocs, false); + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + + controller.changeDocs(vc, new EntryReference<>(entry, entry.getName()), newDocs); + + if (!vc.canProceed()) return; controller.sendPacket(new ConfirmChangeC2SPacket(syncId)); } } diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedC2SPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedC2SPacket.java index a41c620..732c744 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedC2SPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedC2SPacket.java @@ -1,14 +1,16 @@ package cuchaz.enigma.network.packet; -import cuchaz.enigma.network.ServerPacketHandler; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.network.Message; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import cuchaz.enigma.network.Message; +import cuchaz.enigma.network.ServerPacketHandler; +import cuchaz.enigma.translation.mapping.EntryMapping; +import cuchaz.enigma.translation.representation.entry.Entry; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; + public class MarkDeobfuscatedC2SPacket implements Packet { private Entry entry; @@ -31,18 +33,24 @@ public class MarkDeobfuscatedC2SPacket implements Packet { @Override public void handle(ServerPacketHandler handler) { + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + boolean valid = handler.getServer().canModifyEntry(handler.getClient(), entry); + if (!valid) { handler.getServer().sendCorrectMapping(handler.getClient(), entry, true); return; } - handler.getServer().getMappings().mapFromObf(entry, new EntryMapping(handler.getServer().getMappings().deobfuscate(entry).getName())); + handler.getServer().getMappings().mapFromObf(vc, entry, new EntryMapping(handler.getServer().getMappings().deobfuscate(entry).getName())); + + if (!vc.canProceed()) return; + handler.getServer().log(handler.getServer().getUsername(handler.getClient()) + " marked " + entry + " as deobfuscated"); int syncId = handler.getServer().lockEntry(handler.getClient(), entry); handler.getServer().sendToAllExcept(handler.getClient(), new MarkDeobfuscatedS2CPacket(syncId, entry)); handler.getServer().sendMessage(Message.markDeobf(handler.getServer().getUsername(handler.getClient()), entry)); - } } diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedS2CPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedS2CPacket.java index 7504430..969d13c 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedS2CPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/MarkDeobfuscatedS2CPacket.java @@ -1,13 +1,15 @@ package cuchaz.enigma.network.packet; -import cuchaz.enigma.analysis.EntryReference; -import cuchaz.enigma.network.ClientPacketHandler; -import cuchaz.enigma.translation.representation.entry.Entry; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import cuchaz.enigma.analysis.EntryReference; +import cuchaz.enigma.network.ClientPacketHandler; +import cuchaz.enigma.translation.representation.entry.Entry; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; + public class MarkDeobfuscatedS2CPacket implements Packet { private int syncId; private Entry entry; @@ -34,7 +36,12 @@ public class MarkDeobfuscatedS2CPacket implements Packet { @Override public void handle(ClientPacketHandler controller) { - controller.markAsDeobfuscated(new EntryReference<>(entry, entry.getName()), false); + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + + controller.markAsDeobfuscated(vc, new EntryReference<>(entry, entry.getName())); + + if (!vc.canProceed()) return; controller.sendPacket(new ConfirmChangeC2SPacket(syncId)); } } diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingC2SPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingC2SPacket.java index 3f85228..298e674 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingC2SPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingC2SPacket.java @@ -1,14 +1,15 @@ package cuchaz.enigma.network.packet; -import cuchaz.enigma.network.ServerPacketHandler; -import cuchaz.enigma.translation.mapping.IllegalNameException; -import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.network.Message; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import cuchaz.enigma.network.Message; +import cuchaz.enigma.network.ServerPacketHandler; +import cuchaz.enigma.translation.representation.entry.Entry; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; + public class RemoveMappingC2SPacket implements Packet { private Entry entry; @@ -31,14 +32,14 @@ public class RemoveMappingC2SPacket implements Packet { @Override public void handle(ServerPacketHandler handler) { + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + boolean valid = handler.getServer().canModifyEntry(handler.getClient(), entry); if (valid) { - try { - handler.getServer().getMappings().removeByObf(entry); - } catch (IllegalNameException e) { - valid = false; - } + handler.getServer().getMappings().removeByObf(vc, entry); + valid = vc.canProceed(); } if (!valid) { diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingS2CPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingS2CPacket.java index 70d803c..e336c7b 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingS2CPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RemoveMappingS2CPacket.java @@ -1,13 +1,15 @@ package cuchaz.enigma.network.packet; -import cuchaz.enigma.analysis.EntryReference; -import cuchaz.enigma.network.ClientPacketHandler; -import cuchaz.enigma.translation.representation.entry.Entry; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import cuchaz.enigma.analysis.EntryReference; +import cuchaz.enigma.network.ClientPacketHandler; +import cuchaz.enigma.translation.representation.entry.Entry; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; + public class RemoveMappingS2CPacket implements Packet { private int syncId; private Entry entry; @@ -34,7 +36,12 @@ public class RemoveMappingS2CPacket implements Packet { @Override public void handle(ClientPacketHandler controller) { - controller.removeMapping(new EntryReference<>(entry, entry.getName()), false); + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + + controller.removeMapping(vc, new EntryReference<>(entry, entry.getName())); + + if (!vc.canProceed()) return; controller.sendPacket(new ConfirmChangeC2SPacket(syncId)); } } diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameC2SPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameC2SPacket.java index e3e7e37..6a7d2fd 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameC2SPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameC2SPacket.java @@ -1,14 +1,15 @@ package cuchaz.enigma.network.packet; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + import cuchaz.enigma.network.ServerPacketHandler; -import cuchaz.enigma.translation.mapping.IllegalNameException; import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.representation.entry.Entry; import cuchaz.enigma.network.Message; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; public class RenameC2SPacket implements Packet { private Entry entry; @@ -40,14 +41,14 @@ public class RenameC2SPacket implements Packet { @Override public void handle(ServerPacketHandler handler) { + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + boolean valid = handler.getServer().canModifyEntry(handler.getClient(), entry); if (valid) { - try { - handler.getServer().getMappings().mapFromObf(entry, new EntryMapping(newName)); - } catch (IllegalNameException e) { - valid = false; - } + handler.getServer().getMappings().mapFromObf(vc, entry, new EntryMapping(newName)); + valid = vc.canProceed(); } if (!valid) { diff --git a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameS2CPacket.java b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameS2CPacket.java index 787e89e..fdf0654 100644 --- a/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameS2CPacket.java +++ b/enigma-server/src/main/java/cuchaz/enigma/network/packet/RenameS2CPacket.java @@ -1,13 +1,15 @@ package cuchaz.enigma.network.packet; -import cuchaz.enigma.analysis.EntryReference; -import cuchaz.enigma.network.ClientPacketHandler; -import cuchaz.enigma.translation.representation.entry.Entry; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import cuchaz.enigma.analysis.EntryReference; +import cuchaz.enigma.network.ClientPacketHandler; +import cuchaz.enigma.translation.representation.entry.Entry; +import cuchaz.enigma.utils.validation.PrintValidatable; +import cuchaz.enigma.utils.validation.ValidationContext; + public class RenameS2CPacket implements Packet { private int syncId; private Entry entry; @@ -42,7 +44,12 @@ public class RenameS2CPacket implements Packet { @Override public void handle(ClientPacketHandler controller) { - controller.rename(new EntryReference<>(entry, entry.getName()), newName, refreshClassTree, false); + ValidationContext vc = new ValidationContext(); + vc.setActiveElement(PrintValidatable.INSTANCE); + + controller.rename(vc, new EntryReference<>(entry, entry.getName()), newName, refreshClassTree); + + if (!vc.canProceed()) return; controller.sendPacket(new ConfirmChangeC2SPacket(syncId)); } } -- cgit v1.2.3