Skip to content

Commit cd12242

Browse files
committed
Allow users to add comments to code
1 parent 4d7f0f1 commit cd12242

File tree

8 files changed

+125
-27
lines changed

8 files changed

+125
-27
lines changed

src/main/java/club/bytecode/the/jda/gui/MainViewerGUI.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ public class MainViewerGUI extends JFrame implements IPersistentWindow {
5858
public List<ButtonGroup> allPanes = Collections.unmodifiableList(Arrays.asList(panelGroups));
5959
public Map<ButtonGroup, Map<JRadioButtonMenuItem, JDADecompiler>> allDecompilers = new HashMap<>();
6060
public Map<ButtonGroup, Map<JDADecompiler, JRadioButtonMenuItem>> allDecompilersRev = new HashMap<>();
61-
public Map<ButtonGroup, Map<JDADecompiler, JCheckBoxMenuItem>> editButtons = new HashMap<>();
6261
public JMenu mnRecentFiles = new JMenu("Recent Files");
6362
private JMenuItem spinnerMenu = new JMenuItem("");
6463
public FontOptionsDialog fontOptionsDialog = new FontOptionsDialog();
@@ -72,7 +71,6 @@ public MainViewerGUI() {
7271
ButtonGroup panelGroup = new ButtonGroup();
7372
allDecompilers.put(panelGroup, new HashMap<>());
7473
allDecompilersRev.put(panelGroup, new HashMap<>());
75-
editButtons.put(panelGroup, new HashMap<>());
7674
panelGroups[i] = panelGroup;
7775
}
7876
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new JDAKeybindManager());

src/main/java/club/bytecode/the/jda/gui/fileviewer/BytecodeSyntaxArea.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
import java.util.List;
1313
import java.util.Map;
1414

15-
public class BytecodeSyntaxArea extends RSyntaxTextArea {
15+
public class BytecodeSyntaxArea extends JDATextArea {
1616
public Map<Fold, List<Token>> tokenIndex;
1717
public final Map<Token, Fold> parentFoldCache;
1818
public boolean foldsBuilt;
1919

20-
public BytecodeSyntaxArea() {
20+
public BytecodeSyntaxArea(String text) {
21+
super(text);
2122
setSyntaxEditingStyle(BytecodeTokenizer.SYNTAX_STYLE_BYTECODE);
2223

2324
setLinkScanningMask(0);

src/main/java/club/bytecode/the/jda/gui/fileviewer/ClassViewer.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,6 @@ public void setPanes() {
3838
}
3939
}
4040

41-
public boolean isPaneEditable(int pane) {
42-
setPanes();
43-
ButtonGroup buttonGroup = JDA.viewer.allPanes.get(pane);
44-
JDADecompiler selected = decompilers.get(pane);
45-
if (buttonGroup != null && JDA.viewer.editButtons.get(buttonGroup) != null && JDA.viewer.editButtons.get(buttonGroup).get(selected) != null && JDA.viewer.editButtons.get(buttonGroup).get(selected).isSelected()) {
46-
return true;
47-
}
48-
return false;
49-
}
50-
5141
public void updatePane(int pane, RSyntaxTextArea text, JDADecompiler decompiler) {
5242
javas.set(pane, text);
5343
SearchPanel search = new SearchPanel(text);

src/main/java/club/bytecode/the/jda/gui/fileviewer/DecompileThread.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
import club.bytecode.the.jda.decompilers.JDADecompiler;
66
import club.bytecode.the.jda.decompilers.bytecode.BytecodeDecompiler;
77
import club.bytecode.the.jda.decompilers.filter.DecompileFilter;
8-
import club.bytecode.the.jda.settings.Settings;
98
import com.strobel.annotations.Nullable;
109
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
1110
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
1211
import org.fife.ui.rtextarea.RTextScrollPane;
1312
import org.objectweb.asm.tree.ClassNode;
1413

1514
import javax.swing.*;
16-
import java.awt.*;
1715

1816
/**
1917
* Updates a pane
@@ -49,27 +47,21 @@ public void run() {
4947
decompileResult = decompiler.decompileClassNode(viewer.getFile().container, cn);
5048
}
5149

50+
String text = stripUndisplayableChars(decompileResult);
5251
RSyntaxTextArea panelArea;
5352
if (decompiler instanceof BytecodeDecompiler) {
54-
panelArea = new BytecodeSyntaxArea();
53+
panelArea = new BytecodeSyntaxArea(text);
5554
} else {
56-
panelArea = new RSyntaxTextArea();
55+
panelArea = new JDATextArea(text);
5756
panelArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
5857
}
59-
panelArea.setCodeFoldingEnabled(true);
60-
panelArea.setAntiAliasingEnabled(true);
61-
58+
6259
final RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
63-
panelArea.setText(stripUndisplayableChars(decompileResult));
64-
panelArea.setCaretPosition(0);
65-
panelArea.setEditable(viewer.isPaneEditable(paneId));
6660
StringBuilder topLabelText = new StringBuilder(decompiler.getName());
6761
for (DecompileFilter filter : decompiler.getSettings().getEnabledFilters()) {
6862
topLabelText.append(" + ").append(filter.getName());
6963
}
7064
scrollPane.setColumnHeaderView(new JLabel(topLabelText.toString()));
71-
panelArea.setFont(new Font(Settings.FONT_FAMILY.getString(), Settings.FONT_OPTIONS.getInt(), Settings.FONT_SIZE.getInt()));
72-
7365
SwingUtilities.invokeLater(() -> target.add(scrollPane));
7466
viewer.updatePane(paneId, panelArea, decompiler);
7567
} catch (Exception e) {

src/main/java/club/bytecode/the/jda/gui/fileviewer/FileViewerPane.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import club.bytecode.the.jda.gui.JDAWindow;
66
import club.bytecode.the.jda.gui.components.TabbedPane;
77
import club.bytecode.the.jda.gui.navigation.FileNavigationPane;
8-
import org.mapleir.stdlib.util.IndexedList;
8+
import org.mapleir.stdlib.collections.list.IndexedList;
99

1010
import javax.swing.*;
1111
import java.awt.*;
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package club.bytecode.the.jda.gui.fileviewer;
2+
3+
import club.bytecode.the.jda.settings.Settings;
4+
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
5+
6+
import javax.swing.*;
7+
import javax.swing.text.BadLocationException;
8+
import java.awt.*;
9+
import java.awt.event.KeyEvent;
10+
import java.util.*;
11+
import java.util.List;
12+
13+
public class JDATextArea extends RSyntaxTextArea {
14+
private List<String> lines;
15+
private Map<Integer, String> comments;
16+
17+
public JDATextArea(String text) {
18+
lines = Collections.unmodifiableList(Arrays.asList(text.split("\n")));
19+
comments = new HashMap<>();
20+
21+
setCodeFoldingEnabled(true);
22+
setAntiAliasingEnabled(true);
23+
24+
setText(text);
25+
setCaretPosition(0);
26+
setFont(new Font(Settings.FONT_FAMILY.getString(), Settings.FONT_OPTIONS.getInt(), Settings.FONT_SIZE.getInt()));
27+
28+
setEditable(true);
29+
addKeyListener(new JDATextAreaKeyListener());
30+
}
31+
32+
private void addCommentDialog() {
33+
setComment(getCaretLineNumber(), JOptionPane.showInputDialog("Enter a comment"));
34+
}
35+
36+
private void setComment(int line, String comment) {
37+
if (comment == null || comment.isEmpty())
38+
comments.remove(line);
39+
else
40+
comments.put(line, comment);
41+
resetLine(line);
42+
}
43+
44+
private void resetLine(int line) {
45+
String lineText = lines.get(line);
46+
if (comments.containsKey(line)) {
47+
lineText += " // " + comments.get(line);
48+
}
49+
try {
50+
replaceRange(lineText, getLineStartOffset(line), getLineEndOffset(line) - 1);
51+
} catch (BadLocationException e) {
52+
e.printStackTrace();
53+
}
54+
}
55+
56+
public class JDATextAreaKeyListener extends NonRepeatKeyListener {
57+
public JDATextAreaKeyListener() {
58+
}
59+
60+
@Override
61+
public void keyTyped(KeyEvent e) {
62+
e.consume();
63+
}
64+
65+
@Override
66+
public void keyPressed(KeyEvent e) {
67+
super.keyPressed(e);
68+
e.consume();
69+
}
70+
71+
@Override
72+
public void keyReleased(KeyEvent e) {
73+
super.keyReleased(e);
74+
}
75+
76+
@Override
77+
protected void onDown(KeyEvent e) {
78+
switch (e.getKeyCode()) {
79+
case KeyEvent.VK_SLASH:
80+
addCommentDialog();
81+
}
82+
}
83+
84+
@Override
85+
protected void onUp(KeyEvent e) {
86+
87+
}
88+
}
89+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
package club.bytecode.the.jda.gui.fileviewer;
2+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package club.bytecode.the.jda.gui.fileviewer;
2+
3+
import java.awt.event.KeyEvent;
4+
import java.awt.event.KeyListener;
5+
import java.util.HashSet;
6+
import java.util.Set;
7+
8+
public abstract class NonRepeatKeyListener implements KeyListener {
9+
Set<Integer> pressedKeys = new HashSet<>();
10+
11+
@Override
12+
public void keyPressed(KeyEvent e) {
13+
if (pressedKeys.add(e.getKeyCode())) {
14+
onDown(e);
15+
}
16+
}
17+
18+
@Override
19+
public void keyReleased(KeyEvent e) {
20+
pressedKeys.remove(e.getKeyCode());
21+
onUp(e);
22+
}
23+
24+
protected abstract void onDown(KeyEvent e);
25+
protected abstract void onUp(KeyEvent e);
26+
}

0 commit comments

Comments
 (0)