fix(gui): improve code area performance and line numbers repaint (#1167)

This commit is contained in:
Skylot
2021-05-07 14:45:23 +03:00
parent 8dad158ae6
commit 4732fa36a6
5 changed files with 10 additions and 22 deletions
@@ -66,11 +66,6 @@ public final class JavaClass implements JavaNode {
return cls.getSmali();
}
public synchronized void unload() {
cls.unload();
listsLoaded = false;
}
/**
* Internal API. Not Stable!
*/
@@ -68,8 +68,6 @@ public class JadxWrapper {
decompiler.getArgs().setRootDir(dir);
decompiler.save(500, (done, total) -> progressMonitor.setProgress((int) (done * 100.0 / total)));
progressMonitor.close();
LOG.info("decompilation complete, freeing memory ...");
decompiler.getClasses().forEach(JavaClass::unload);
LOG.info("done");
};
new Thread(save).start();
@@ -57,11 +57,11 @@ public class JClass extends JLoadableNode {
}
public synchronized void load() {
if (!loaded) {
cls.decompile();
cls.unload();
loaded = true;
if (loaded) {
return;
}
cls.decompile();
loaded = true;
update();
}
@@ -69,7 +69,6 @@ public class JClass extends JLoadableNode {
cls.reload();
loaded = true;
update();
cls.unload();
}
public synchronized void update() {
@@ -93,8 +92,7 @@ public class JClass extends JLoadableNode {
@Override
public @Nullable ICodeInfo getCodeInfo() {
load();
return cls.getClassNode().getCode();
return cls.getCodeInfo();
}
@Override
@@ -120,9 +120,6 @@ public class CodePanel extends JPanel {
if (codeArea instanceof SmaliArea) {
return;
}
LineNumbers numbers = new LineNumbers(codeArea);
numbers.setUseSourceLines(isUseSourceLines());
codeScrollPane.setRowHeaderView(numbers);
initLineNumbers(isUseSourceLines());
}
@@ -42,7 +42,8 @@ public class LineNumbers extends JPanel implements CaretListener {
private static final int NUM_HEIGHT = Integer.MAX_VALUE - 1000000;
private static final Map<?, ?> DESKTOP_HINTS = (Map<?, ?>) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
private final AbstractCodeArea codeArea;
private final transient AbstractCodeArea codeArea;
private final transient ICodeInfo codeInfo;
private boolean useSourceLines = true;
private transient int lastDigits;
@@ -55,10 +56,11 @@ public class LineNumbers extends JPanel implements CaretListener {
private transient Insets textAreaInsets;
private transient Rectangle visibleRect = new Rectangle();
private transient ICodeInfo codeInfo;
public LineNumbers(AbstractCodeArea codeArea) {
this.codeArea = codeArea;
this.codeInfo = codeArea.getNode().getCodeInfo();
setFont(codeArea.getFont());
SyntaxScheme syntaxScheme = codeArea.getSyntaxScheme();
numberColor = syntaxScheme.getStyle(Token.LITERAL_NUMBER_DECIMAL_INT).foreground;
@@ -110,8 +112,6 @@ public class LineNumbers extends JPanel implements CaretListener {
@SuppressWarnings("deprecation")
@Override
public void paintComponent(Graphics g) {
codeInfo = codeArea.getNode().getCodeInfo();
visibleRect = g.getClipBounds(visibleRect);
if (visibleRect == null) {
visibleRect = getVisibleRect();
@@ -127,7 +127,7 @@ public class LineNumbers extends JPanel implements CaretListener {
Dimension size = getSize();
g.setColor(codeArea.getBackground());
g.fillRect(0, 0, size.width, size.height);
g.fillRect(0, visibleRect.y, size.width, visibleRect.height);
FontMetrics fontMetrics = codeArea.getFontMetrics(font);
Insets insets = getInsets();