From 3d1f614687133af5c325f9ae09146b878b1c0ad9 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 25 Apr 2022 17:49:45 +0200 Subject: [PATCH 1/9] Remove unused ExpandedIcon and CollapsedIcon --- .../resources/IconResources.java | 50 ------------------- 1 file changed, 50 deletions(-) diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java index 7e2a89a6..c3f76a63 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java @@ -143,54 +143,4 @@ public class IconResources return image; } - - - /** - * The minus sign button icon - */ - public static class ExpandedIcon implements Icon, Serializable - { - static public Icon createExpandedIcon() { - return new ExpandedIcon(); - } - - public void paintIcon(Component c, Graphics g, int x, int y) - { - Color backgroundColor = c.getBackground(); - if(backgroundColor != null) - g.setColor(backgroundColor); - else - g.setColor(Color.white); - - g.fillRect(x, y, SIZE-1, SIZE-1); - g.setColor(Color.gray); - g.drawRect(x, y, SIZE-1, SIZE-1); - g.setColor(Color.black); - g.drawLine(x + 2, y + HALF_SIZE, x + (SIZE - 3), y + HALF_SIZE); - } - - public int getIconWidth() { - return SIZE; - } - - public int getIconHeight() { - return SIZE; - } - } - - /** - * The plus sign button icon - */ - public static class CollapsedIcon extends ExpandedIcon - { - static public Icon createCollapsedIcon() { - return new CollapsedIcon(); - } - - public void paintIcon(Component c, Graphics g, int x, int y) - { - super.paintIcon(c, g, x, y); - g.drawLine(x + HALF_SIZE, y + 2, x + HALF_SIZE, y + (SIZE - 3)); - } - } } From 47e069c44feed54c1d42f56aec5f1ee103f58f71 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 25 Apr 2022 17:51:58 +0200 Subject: [PATCH 2/9] Move loadResourceAsString to Resource class It doesn't make much sense for this function to sit inside IconResources, as it isn't an IconResource. --- .../club/bytecodeviewer/plugin/PluginTemplate.java | 3 ++- .../bytecodeviewer/resources/IconResources.java | 9 --------- .../club/bytecodeviewer/resources/Resource.java | 14 ++++++++++++++ .../club/bytecodeviewer/translation/Language.java | 5 +++-- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/plugin/PluginTemplate.java b/src/main/java/the/bytecode/club/bytecodeviewer/plugin/PluginTemplate.java index 783cde2b..ec67bb18 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/plugin/PluginTemplate.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/plugin/PluginTemplate.java @@ -4,6 +4,7 @@ import java.io.IOException; import org.apache.commons.io.FilenameUtils; import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.resources.IconResources; +import the.bytecode.club.bytecodeviewer.resources.Resource; /*************************************************************************** * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * @@ -46,7 +47,7 @@ public enum PluginTemplate public String getContents() throws IOException { if(contents == null) - contents = IconResources.loadResourceAsString(resourcePath); + contents = Resource.loadResourceAsString(resourcePath); return contents; } diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java index c3f76a63..ef571150 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java @@ -112,15 +112,6 @@ public class IconResources } } - public static String loadResourceAsString(String resourcePath) throws IOException - { - try (InputStream is = IconResources.class.getResourceAsStream(resourcePath)) { - if (is == null) - return null; - return IOUtils.toString(is, StandardCharsets.UTF_8); - } - } - public static BufferedImage resize(BufferedImage image, int width, int height) { return Scalr.resize(image, Scalr.Method.ULTRA_QUALITY, width, height); } diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/Resource.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/Resource.java index f36035e7..6b7a2a45 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/Resource.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/Resource.java @@ -1,7 +1,12 @@ package the.bytecode.club.bytecodeviewer.resources; +import org.apache.commons.io.IOUtils; import org.objectweb.asm.tree.ClassNode; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + /*************************************************************************** * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com * @@ -36,6 +41,15 @@ public class Resource this.workingName = workingName; this.container = container; } + + public static String loadResourceAsString(String resourcePath) throws IOException + { + try (InputStream is = IconResources.class.getResourceAsStream(resourcePath)) { + if (is == null) + return null; + return IOUtils.toString(is, StandardCharsets.UTF_8); + } + } /** * Returns the resource bytes from the resource container diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/translation/Language.java b/src/main/java/the/bytecode/club/bytecodeviewer/translation/Language.java index a240d5e3..03ee1035 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/translation/Language.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/translation/Language.java @@ -14,6 +14,7 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.Constants; import the.bytecode.club.bytecodeviewer.api.BCV; import the.bytecode.club.bytecodeviewer.resources.IconResources; +import the.bytecode.club.bytecodeviewer.resources.Resource; /*************************************************************************** * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * @@ -158,7 +159,7 @@ public enum Language if(translationMap == null) { translationMap = BytecodeViewer.gson.fromJson( - IconResources.loadResourceAsString(resourcePath), + Resource.loadResourceAsString(resourcePath), new TypeToken>() {}.getType()); } @@ -178,7 +179,7 @@ public enum Language return; LinkedMap translationMap = BytecodeViewer.gson.fromJson( - IconResources.loadResourceAsString(resourcePath), + Resource.loadResourceAsString(resourcePath), new TypeToken>(){}.getType()); Set existingKeys = new HashSet<>(); From 40e26c27f8f1d4d06a8abd1d78fd2c922183ecc4 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 25 Apr 2022 17:53:06 +0200 Subject: [PATCH 3/9] Replace usage of IconImage with Icon This allows us to use icons other than ImageIcons. --- .../ResourceListIconRenderer.java | 7 ++- .../resources/IconResources.java | 44 +++++++++---------- .../resources/ResourceType.java | 8 ++-- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListIconRenderer.java b/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListIconRenderer.java index bc5a1dac..49b9feae 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListIconRenderer.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListIconRenderer.java @@ -5,8 +5,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.swing.ImageIcon; -import javax.swing.JTree; +import javax.swing.*; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeNode; import org.apache.commons.io.FilenameUtils; @@ -21,7 +20,7 @@ import the.bytecode.club.bytecodeviewer.resources.ResourceType; public class ResourceListIconRenderer extends DefaultTreeCellRenderer { //TODO the icon cache needs to be cleared on treenode removal - public static Map iconCache = new HashMap<>(); + public static Map iconCache = new HashMap<>(); //called every time there is a pane update @Override @@ -134,7 +133,7 @@ public class ResourceListIconRenderer extends DefaultTreeCellRenderer return ret; } - public void cacheNodeIcon(ResourceTreeNode node, ImageIcon icon) + public void cacheNodeIcon(ResourceTreeNode node, Icon icon) { iconCache.put(node, icon); setIcon(icon); diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java index ef571150..9ee03bff 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java @@ -49,28 +49,28 @@ public class IconResources static protected final int HALF_SIZE = 4; static protected final int SIZE = 9; - public static List iconList; - public static BufferedImage icon; - public static ImageIcon nextIcon; - public static ImageIcon prevIcon; - public static ImageIcon busyIcon; - public static ImageIcon busyB64Icon; - public static ImageIcon batIcon; - public static ImageIcon shIcon; - public static ImageIcon csharpIcon; - public static ImageIcon cplusplusIcon; - public static ImageIcon configIcon; - public static ImageIcon jarIcon; - public static ImageIcon zipIcon; - public static ImageIcon packagesIcon; - public static ImageIcon folderIcon; - public static ImageIcon androidIcon; - public static ImageIcon unknownFileIcon; - public static ImageIcon textIcon; - public static ImageIcon classIcon; - public static ImageIcon imageIcon; - public static ImageIcon decodedIcon; - public static ImageIcon javaIcon; + public static final List iconList; + public static final BufferedImage icon; + public static final Icon nextIcon; + public static final Icon prevIcon; + public static final Icon busyIcon; + public static final Icon busyB64Icon; + public static final Icon batIcon; + public static final Icon shIcon; + public static final Icon csharpIcon; + public static final Icon cplusplusIcon; + public static final Icon configIcon; + public static final Icon jarIcon; + public static final Icon zipIcon; + public static final Icon packagesIcon; + public static final Icon folderIcon; + public static final Icon androidIcon; + public static final Icon unknownFileIcon; + public static final Icon textIcon; + public static final Icon classIcon; + public static final Icon imageIcon; + public static final Icon decodedIcon; + public static final Icon javaIcon; static { diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/ResourceType.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/ResourceType.java index 6613bc2d..dd02c3b4 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/ResourceType.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/ResourceType.java @@ -2,7 +2,7 @@ package the.bytecode.club.bytecodeviewer.resources; import java.util.HashMap; import java.util.Map; -import javax.swing.ImageIcon; +import javax.swing.*; /*************************************************************************** * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * @@ -53,7 +53,7 @@ public enum ResourceType public static final Map imageExtensionMap = new HashMap<>(); public static final Map supportedBCVExtensionMap = new HashMap<>(); - private final ImageIcon icon; + private final Icon icon; private final String[] extensions; //private final byte[][] headerMagicNumber; @@ -79,13 +79,13 @@ public enum ResourceType supportedBCVExtensionMap.put(extension, ANDROID_ARCHIVE); } - ResourceType(ImageIcon icon, String... extensions) + ResourceType(Icon icon, String... extensions) { this.icon = icon; this.extensions = extensions; } - public ImageIcon getIcon() + public Icon getIcon() { return icon; } From 0bf39f22c365400c08542b228e9ce8de2dbc8677 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 25 Apr 2022 18:00:56 +0200 Subject: [PATCH 4/9] Remove unused constant HALF_SIZE --- .../bytecode/club/bytecodeviewer/resources/IconResources.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java index 9ee03bff..440de015 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java @@ -46,7 +46,6 @@ import the.bytecode.club.bytecodeviewer.BytecodeViewer; public class IconResources { - static protected final int HALF_SIZE = 4; static protected final int SIZE = 9; public static final List iconList; From 3a5bf23d855bae759c8fa9302a91c028a18773e1 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 25 Apr 2022 23:45:37 +0200 Subject: [PATCH 5/9] Update darklaf to version 3.0.1 --- pom.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7a633f61..65465760 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.11.0 3.12.0 1.9 - 3.0.0 + 3.0.1-SNAPSHOT 0.4.1 5.2.1.Final v49 @@ -66,6 +66,10 @@ jitpack.io https://jitpack.io + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + From 2cb9b80815e420a83c3682753b12e2c8466bed79 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 25 Apr 2022 23:46:17 +0200 Subject: [PATCH 6/9] Replace icons with more modern svg variants --- .../gui/components/WaitBusyIcon.java | 30 ++++--- .../resources/IconResources.java | 84 +++++++----------- src/main/resources/gui/android.png | Bin 3000 -> 0 bytes src/main/resources/gui/android.svg | 20 +++++ src/main/resources/gui/archive.svg | 37 ++++++++ src/main/resources/gui/bat.png | Bin 507 -> 0 bytes src/main/resources/gui/bat.svg | 10 +++ src/main/resources/gui/bcv_icon.png | Bin 0 -> 8653 bytes src/main/resources/gui/c#.png | Bin 700 -> 0 bytes src/main/resources/gui/c++.png | Bin 621 -> 0 bytes src/main/resources/gui/class.png | Bin 639 -> 0 bytes src/main/resources/gui/config.png | Bin 402 -> 0 bytes src/main/resources/gui/config.svg | 20 +++++ src/main/resources/gui/cpp.svg | 33 +++++++ src/main/resources/gui/cs.svg | 31 +++++++ src/main/resources/gui/decoded.png | Bin 570 -> 0 bytes src/main/resources/gui/decodedResource.svg | 23 +++++ src/main/resources/gui/file.png | Bin 294 -> 0 bytes src/main/resources/gui/folder.png | Bin 537 -> 0 bytes src/main/resources/gui/image.png | Bin 606 -> 0 bytes src/main/resources/gui/jar.png | Bin 1943 -> 0 bytes src/main/resources/gui/jarDirectory.svg | 14 +++ src/main/resources/gui/java.png | Bin 488 -> 0 bytes src/main/resources/gui/java.svg | 27 ++++++ src/main/resources/gui/javaClass.svg | 28 ++++++ src/main/resources/gui/loading.gif | Bin 560 -> 0 bytes src/main/resources/gui/next.svg | 13 +++ src/main/resources/gui/package.png | Bin 345 -> 0 bytes src/main/resources/gui/package.svg | 12 +++ src/main/resources/gui/previous.svg | 14 +++ src/main/resources/gui/sh.png | Bin 525 -> 0 bytes src/main/resources/gui/text.png | Bin 618 -> 0 bytes src/main/resources/gui/zip.png | Bin 386 -> 0 bytes 33 files changed, 332 insertions(+), 64 deletions(-) delete mode 100644 src/main/resources/gui/android.png create mode 100644 src/main/resources/gui/android.svg create mode 100644 src/main/resources/gui/archive.svg delete mode 100644 src/main/resources/gui/bat.png create mode 100644 src/main/resources/gui/bat.svg create mode 100644 src/main/resources/gui/bcv_icon.png delete mode 100644 src/main/resources/gui/c#.png delete mode 100644 src/main/resources/gui/c++.png delete mode 100644 src/main/resources/gui/class.png delete mode 100644 src/main/resources/gui/config.png create mode 100644 src/main/resources/gui/config.svg create mode 100644 src/main/resources/gui/cpp.svg create mode 100644 src/main/resources/gui/cs.svg delete mode 100644 src/main/resources/gui/decoded.png create mode 100644 src/main/resources/gui/decodedResource.svg delete mode 100644 src/main/resources/gui/file.png delete mode 100644 src/main/resources/gui/folder.png delete mode 100644 src/main/resources/gui/image.png delete mode 100644 src/main/resources/gui/jar.png create mode 100644 src/main/resources/gui/jarDirectory.svg delete mode 100644 src/main/resources/gui/java.png create mode 100644 src/main/resources/gui/java.svg create mode 100644 src/main/resources/gui/javaClass.svg delete mode 100644 src/main/resources/gui/loading.gif create mode 100644 src/main/resources/gui/next.svg delete mode 100644 src/main/resources/gui/package.png create mode 100644 src/main/resources/gui/package.svg create mode 100644 src/main/resources/gui/previous.svg delete mode 100644 src/main/resources/gui/sh.png delete mode 100644 src/main/resources/gui/text.png delete mode 100644 src/main/resources/gui/zip.png diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/gui/components/WaitBusyIcon.java b/src/main/java/the/bytecode/club/bytecodeviewer/gui/components/WaitBusyIcon.java index b47a56cc..3ff59f92 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/gui/components/WaitBusyIcon.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/gui/components/WaitBusyIcon.java @@ -1,8 +1,15 @@ package the.bytecode.club.bytecodeviewer.gui.components; import javax.swing.Icon; + +import com.github.weisj.darklaf.components.RotatableIconAnimator; +import com.github.weisj.darklaf.components.loading.LoadingIndicator; +import com.github.weisj.darklaf.iconset.AllIcons; +import com.github.weisj.darklaf.properties.icons.RotatableIcon; import the.bytecode.club.bytecodeviewer.resources.IconResources; +import java.awt.event.*; + /*************************************************************************** * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com * @@ -27,17 +34,20 @@ import the.bytecode.club.bytecodeviewer.resources.IconResources; */ public class WaitBusyIcon extends JMenuItemIcon { + private final RotatableIconAnimator animator; + public WaitBusyIcon() { - super(loadIcon()); - setAlignmentY(0.65f); - } - - public static Icon loadIcon() - { - if(IconResources.busyIcon != null) - return IconResources.busyIcon; - - return IconResources.busyB64Icon; + super(new RotatableIcon(IconResources.busyIcon)); + animator = new RotatableIconAnimator(8, (RotatableIcon) getIcon(), this); + addHierarchyListener(e -> { + if ((e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) + { + if (getParent() == null) + animator.stop(); + else + animator.start(); + } + }); } } diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java index 440de015..60ce7c76 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java @@ -1,22 +1,16 @@ package the.bytecode.club.bytecodeviewer.resources; -import java.awt.Color; -import java.awt.Component; -import java.awt.Graphics; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Objects; import javax.imageio.ImageIO; import javax.swing.Icon; -import javax.swing.ImageIcon; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.IOUtils; + +import com.github.weisj.darklaf.iconset.AllIcons; +import com.github.weisj.darklaf.properties.icons.IconLoader; +import com.github.weisj.darklaf.properties.icons.IconResolver; import org.imgscalr.Scalr; import the.bytecode.club.bytecodeviewer.BytecodeViewer; @@ -53,7 +47,6 @@ public class IconResources public static final Icon nextIcon; public static final Icon prevIcon; public static final Icon busyIcon; - public static final Icon busyB64Icon; public static final Icon batIcon; public static final Icon shIcon; public static final Icon csharpIcon; @@ -73,34 +66,27 @@ public class IconResources static { - icon = b642IMG("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"); - nextIcon = new ImageIcon(b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX" - + "///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYqPBJSG" - + "/ZAAAASUlEQVR42mNgwAbS0oAEE4yHyWBmYAzjYDC694OJ4f9" - + "+BoY3H0BSbz6A2MxA6VciFyDqGAWQTWVkYEkCUrcOsDD8OwtkvMViMwAb8xEUHlHcFAAAAABJRU5ErkJggg==")); - prevIcon = new ImageIcon(b642IMG("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX" - + "///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAABnRSTlMANzlYgKhxpRi1AAAATElEQVR42mNgwAZYHIAEExA7qUAYLApMDmCGEwODCojByM/A8FEAyPi/moFh9QewYjCAM1iA+D2KqYwMrIlA6tUGFoa/Z4GMt1hsBgCe1wuKber+SwAAAABJRU5ErkJggg==")); - busyIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/loading.gif"))); - busyB64Icon = new ImageIcon(b642IMG("R0lGODlhEAALAPQAAP" - + "///wAAANra2tDQ0Orq6gcHBwAAAC8vL4KCgmFhYbq6uiMjI0tLS4qKimVlZb6+vicnJwUFBU9PT" - + "+bm5tjY2PT09Dk5Odzc3PLy8ra2tqCgoMrKyu7u7gAAAAAAAAAAACH5BAkLAAAAIf4aQ3JlYXRlZCB3aXRoIGFqYXhsb2FkLmluZm8AIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7")); - - batIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/bat.png"))); - shIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/sh.png"))); - csharpIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/c#.png"))); - cplusplusIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/c++.png"))); - configIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/config.png"))); - jarIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/jar.png"))); - zipIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/zip.png"))); - packagesIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/package.png"))); - folderIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/folder.png"))); - androidIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/android.png"))); - unknownFileIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/file.png"))); - textIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/text.png"))); - classIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/class.png"))); - imageIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/image.png"))); - decodedIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/decoded.png"))); - javaIcon = new ImageIcon(Objects.requireNonNull(IconResources.class.getResource("/gui/java.png"))); + IconResolver iconResolver = IconLoader.get(); + icon = loadImageFromResource("gui/bcv_icon.png"); + nextIcon = iconResolver.getIcon("gui/next.svg", true); + prevIcon = iconResolver.getIcon("gui/previous.svg", true); + busyIcon = AllIcons.Misc.Progress.get(); + batIcon = iconResolver.getIcon("gui/bat.svg", true); + shIcon = batIcon; + csharpIcon = iconResolver.getIcon("gui/cs.svg", true); + cplusplusIcon = iconResolver.getIcon("gui/cpp.svg", true); + configIcon = iconResolver.getIcon("gui/config.svg", true); + jarIcon = iconResolver.getIcon("gui/jarDirectory.svg", true); + zipIcon = iconResolver.getIcon("gui/archive.svg", true); + packagesIcon = iconResolver.getIcon("gui/package.svg", true); + folderIcon = AllIcons.Files.Folder.get(); + androidIcon = iconResolver.getIcon("gui/android.svg"); + unknownFileIcon = AllIcons.Files.General.get(); + textIcon = AllIcons.Files.Text.get(); + classIcon = iconResolver.getIcon("gui/javaClass.svg", true); + imageIcon = AllIcons.Files.Image.get(); + decodedIcon = iconResolver.getIcon("gui/decodedResource.svg", true); + javaIcon = iconResolver.getIcon("gui/java.svg", true); iconList = new ArrayList<>(); int size = 16; @@ -111,26 +97,16 @@ public class IconResources } } - public static BufferedImage resize(BufferedImage image, int width, int height) { + private static BufferedImage resize(BufferedImage image, int width, int height) { return Scalr.resize(image, Scalr.Method.ULTRA_QUALITY, width, height); } - /** - * Decodes a Base64 String as a BufferedImage - */ - public static BufferedImage b642IMG(String imageString) { - BufferedImage image = null; - byte[] imageByte; - + private static BufferedImage loadImageFromResource(String imageLocation) { try { - imageByte = Base64.decodeBase64(imageString); - try (ByteArrayInputStream bis = new ByteArrayInputStream(imageByte)) { - image = ImageIO.read(bis); - } - } catch (Exception e) { + return ImageIO.read(Objects.requireNonNull(IconResources.class.getResourceAsStream("/" + imageLocation))); + } catch (IOException e) { BytecodeViewer.handleException(e); } - - return image; + return null; } } diff --git a/src/main/resources/gui/android.png b/src/main/resources/gui/android.png deleted file mode 100644 index 6c242f0ab09963839ec4e907213b69c89bbc7ba5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3000 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 + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/archive.svg b/src/main/resources/gui/archive.svg new file mode 100644 index 00000000..7964fa3b --- /dev/null +++ b/src/main/resources/gui/archive.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/bat.png b/src/main/resources/gui/bat.png deleted file mode 100644 index c28dd63812d80e416682f835652f8e5824bdccb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmVM#v1#3=Jvuyn6YS$$CoGDq?9U@APAh~ZOF>jp#TVKsZ^rDVDQJO z=z(unDix`Pp@6(DbUGbswOaq~fE^0}P{J^D(r7fOTCGyOUUzmBMUy*UwAN0eHX3ch z0VGKh>h*fm?RK3*p0=MB(nc}0O&K6sv)ObGuro)jd=1C!>krB`s44?r3Yg)uiG7!8OBL$a-Fo@&0(0LjNH2#KGJZi@q2YVKu xMc5!EfO4vTMwnf`nA&W_@!!aPwbiWO`5Vn?>V~$MffN7$002ovPDHLkV1l0g-PQmA diff --git a/src/main/resources/gui/bat.svg b/src/main/resources/gui/bat.svg new file mode 100644 index 00000000..f761c7f1 --- /dev/null +++ b/src/main/resources/gui/bat.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/main/resources/gui/bcv_icon.png b/src/main/resources/gui/bcv_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3336018a400add4b0e47abf45649c2d6eee6498b GIT binary patch literal 8653 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 SlK=nD0LV!xOIAym2LA^`tGsIf literal 0 HcmV?d00001 diff --git a/src/main/resources/gui/c#.png b/src/main/resources/gui/c#.png deleted file mode 100644 index ffb8fc932f321d19049a51e0134459e7d6549226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 700 zcmV;t0z>_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?uzE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 diff --git a/src/main/resources/gui/config.svg b/src/main/resources/gui/config.svg new file mode 100644 index 00000000..71581d2e --- /dev/null +++ b/src/main/resources/gui/config.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/cpp.svg b/src/main/resources/gui/cpp.svg new file mode 100644 index 00000000..040f7f08 --- /dev/null +++ b/src/main/resources/gui/cpp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/cs.svg b/src/main/resources/gui/cs.svg new file mode 100644 index 00000000..36201a90 --- /dev/null +++ b/src/main/resources/gui/cs.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/decoded.png b/src/main/resources/gui/decoded.png deleted file mode 100644 index 44ccbf812879c42cb1f9587d865bcfc337ce6361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmV-A0>%A_P)hUn2-Navsqo?5A8 zh}}V^=%7@_%C;=H{tGpIj5CMu*>5J=i;m^t2QTySd)}9aAppozC}++wDz`eOViU-dbRRoz=JsVlZk>N%^azhi%=xTCt9`LQjtqNFW~e|R=r9= z`@I3J^#z@aD5yBuq2DLQO#|4uFW6R5kzPZ+h&6Af&5}POarL&lA~3t5R1i7uh*ffDw@qEs=HBW ze?CI~MkvG6H-MF7r{Yv4kw_q&PNP^XqFgTHXlH@RpLO}3aV{T{Ez=8lo;PHV$Ads1 zfOtF(s5%5V>3qE|&{lueV1Y1j%GF zXt&#NI-LlGLPN>_18TJzN~Mxf*f6pY5Dteo^|P&3>(H{!KTr&_wGRQWb^rhX07*qo IM6N<$g7V1&P5=M^ diff --git a/src/main/resources/gui/decodedResource.svg b/src/main/resources/gui/decodedResource.svg new file mode 100644 index 00000000..df8367f7 --- /dev/null +++ b/src/main/resources/gui/decodedResource.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/file.png b/src/main/resources/gui/file.png deleted file mode 100644 index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 diff --git a/src/main/resources/gui/folder.png b/src/main/resources/gui/folder.png deleted file mode 100644 index 784e8fa48234f4f64b6922a6758f254ee0ca08ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWQ2rnAt>LM%-F zK|rtwgcU)}7x~z1Hrcs5bH*ZO$!>xO8K#?==bZPQ_ecnV>#P`H`QzGaRhd62G_&rC zTLU$c7_x*nFP_dW#Q+*);mMHE?j)HexK784D4x9l_tfpz2$@1y}9rkF+ zI+J5NMWeZyObc!d+rUc=>D+uOdAOg#%+Ej6h+wn5^xPmVVH*Eu446Y0A_@ zo$rlds-+sL10Db)mJv7FqQ-Tn6ae&6r^ z`~ScH|G)2M*cOD289xSspioP?ITO4il>51n;JKvrgIw?$?MZ)Gf}pVPlsjl`eAomC z3Xb5i?Xumvkfa5-nqq_kR_%9t02+c)=K4JpUChdG0b9uN2IS^}W(4LK1CpCy#jG9^ z>*Uf)MK-I{mQ9xy(|QJ(I|okjlYqd@$`tH(yLgH88<2ip5{#8;6oLC8a)&3v=u;Rtm2J_ zG>I%F3u3k)xP}fYV@NV=GQn}V9M1?oY349EYo=t@fDjmgt1yj9gJt6hq&AV%B*bF` ziD3g!tH5xMlHpLDiqK@^8j{eG8to%ckT47-Q%?jlH0cmTHwE0~+*BcpdiX*F4g`@j z2`)hdhJiZG@Og{LlpzWZ&IJ~v%mt~iCC#M6^*W$PjrYs7T1g8p$rMks7PA2Xp;2=j zL*fn%OS2kGrPZ^z3U_E3l|E6g_?$%07*69!M8VL0vp{>51Q^=S{LlT1L=F@n<$7u! zr7V@qA=5btoN38m;bgJP2S+Xr?oSqyqLm^rAhdG&EQ1VAb59+C0a~Av1*HFx7XvU! zaL7JNWQ~O&T2IJ26i7#vVjb`T{ilQdYr_hA2oAc1G7PjS@DXTqEDySy2-?`V9YG-w z^h~_PY|Kuo+EHyO&RQJ(cJGMxeUhqg1mE7|>$2rF?4Q}au_-RcS^Q$?ndsfM`L3v1 zFEpw_YaG9J4g7J@nY9HG5t<+V*ir*W*7#5M8pA>x@@wDk>Xg2@W4NjB>YM_Zj+Up~ zU*2)AtSfvy*&H*Plyg4pJC6Dv&d;bn)8^EMeVMl-?8Jqa-q|@OZ`s4j)Y>;}b#L;G z$xv~~%uy@aiuR1`malEwu=$+&>Yb8?i@ycMEtxg$g}sxf2>STC^UXG}kC^LAJ?GV~ zI~nx-FNFBTiSq{%D>Jvgb?7Jc=o`CE*Vb25>XN^{FuS{Ff5nVb?Mtpnb&U0*7HPz0 z_mqX-kaOC$_k?C{U8C)}#Qk2gy1OH0by@hN{j;1!w}UU=ZYr93u=&BQ${+W~4F=xhPk3ON7?)p)T(ex-xQX>(ccp5y}Bv`8g)HJhH?7 S)wW~GuhWudGw)2zulO63|GE(X diff --git a/src/main/resources/gui/jarDirectory.svg b/src/main/resources/gui/jarDirectory.svg new file mode 100644 index 00000000..0a41d296 --- /dev/null +++ b/src/main/resources/gui/jarDirectory.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/main/resources/gui/java.png b/src/main/resources/gui/java.png deleted file mode 100644 index 4eb93e6f518d93e61f1fb4e3911634632f1ecc2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488 zcmVP)pF7<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMHD!e|WdHyHW=TXrR5(wSlg&=TKoo`1=a9sA!1USF#I5zmGoCs3BKDOhJFB^Bg)y~(l_vI2UnIN74Q!VhQ|%CDzOz39(Z;xd z@9g_XZ%Tn}+psJPhG8rg%tA>~H>ALIT{(|-yS=)A6sscv`}aIginzYAK&zTkz}Zkj zxc)D}-pNQnI2W!j6|jF&xNPF!>=j9p$na9ZW5dHk-G${us69E@Db-QF{*Z!{KLzKa zm_4U(h#fy3pNK3He5MjVOz><5aJ*Q4&tb^S + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/javaClass.svg b/src/main/resources/gui/javaClass.svg new file mode 100644 index 00000000..df6867b8 --- /dev/null +++ b/src/main/resources/gui/javaClass.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gui/loading.gif b/src/main/resources/gui/loading.gif deleted file mode 100644 index 23b21c293b7d84aeee2f66b3e476a6623ffbf08b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmZ?wbhEHb6kytG~bhvuDq4+_>@O%NI*a%R6`OeERfh+qP{B7A!b*>J-of zWT5z;+s`#5*x50_)kx2PnGqeTEtGn_yKlfzB zqLW$9Bb4Re1<_=$JqcklTc7r`w_P#sN)B80YTBa3hc<9x(ZXURaAKubV6j|FpU&x^ z6ro8fC&c@fbgok3+@Z;E>}}-z9Jj-JPoCd4iMMi-FT2L%P`ynYSd3vcRZ!?#^26am zFq6+^10@mH3%4x%gwK~&KDVC5yPWw%i(S$N_g|v@XC@X~vPe~~zSg} + + + + + + + + + + + diff --git a/src/main/resources/gui/package.png b/src/main/resources/gui/package.png deleted file mode 100644 index 0afea5b86397301830f4ae696415e68e01d1dd42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*>(7t7-(Fny^yI?*O@>FC zjc)Iscd$zL`py~qOSKM`YhT|neS5CP?n13|tGibwC{GTRUze=9G)8Gbq~fATrQ-{l z3T?#a6+~3}JN*CuA7~^d;J!5P7En~OB*-rqs0J%wU^L;{4phXL + + + + + + + + diff --git a/src/main/resources/gui/previous.svg b/src/main/resources/gui/previous.svg new file mode 100644 index 00000000..b536587b --- /dev/null +++ b/src/main/resources/gui/previous.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/main/resources/gui/sh.png b/src/main/resources/gui/sh.png deleted file mode 100644 index b3d8ce01e2e9c5a6ce83c3b6d7715cbb2b9d3fb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)>Z+sNt2+U0SgfoD!Wm8sxbT>nyV*Byc6US+Mev^`pI%-cR#%pfrES|$2%tg@7${Im zLBJqCKm^~%kqyWahMtFC{m)BDn@^W+n<9Vs4o8^{xZi&Mv#JmPg~hDhyn9@iQaYl1 zb`JLD2V96U6l8WL=?n97fC_~~t>ED5npj0DEXy*Oju~q^dmy7QgiIy_{eJ&PQrd=O zTr3tLpD%!=R5+2n4HYIFZ-%8JGt|1(g~rh-D=YFj+Az zW(A5Kmc(%jan)&(SOLdLpDi*0KTl?3g3&8WuNWgH;XS@00@rm1q##!+l~R*`BVp_N zo+o>~-p$tT{t5Bs0?k82!-S(@;vSVo<7@Jfu3S^qP;(9ryrKIh{yWa!k>a)0QvY16 P00000NkvXXu0mjf=yc!b diff --git a/src/main/resources/gui/text.png b/src/main/resources/gui/text.png deleted file mode 100644 index b93e77600def75c9a144d3d0a5088a62c02cbb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!T Date: Mon, 25 Apr 2022 23:46:58 +0200 Subject: [PATCH 7/9] Provide fallback values for icon colors with System theme --- .../bytecodeviewer/gui/theme/LAFTheme.java | 75 ++++++++++++++++--- 1 file changed, 65 insertions(+), 10 deletions(-) diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/gui/theme/LAFTheme.java b/src/main/java/the/bytecode/club/bytecodeviewer/gui/theme/LAFTheme.java index ec7418b5..28b5189f 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/gui/theme/LAFTheme.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/gui/theme/LAFTheme.java @@ -2,17 +2,17 @@ package the.bytecode.club.bytecodeviewer.gui.theme; import com.github.weisj.darklaf.LafManager; import com.github.weisj.darklaf.listener.UIUpdater; -import com.github.weisj.darklaf.theme.DarculaTheme; -import com.github.weisj.darklaf.theme.HighContrastDarkTheme; -import com.github.weisj.darklaf.theme.HighContrastLightTheme; -import com.github.weisj.darklaf.theme.IntelliJTheme; -import com.github.weisj.darklaf.theme.OneDarkTheme; -import com.github.weisj.darklaf.theme.SolarizedDarkTheme; -import com.github.weisj.darklaf.theme.SolarizedLightTheme; +import com.github.weisj.darklaf.properties.icons.IconLoader; +import com.github.weisj.darklaf.theme.*; import java.awt.*; +import java.util.Properties; import javax.swing.*; +import javax.swing.text.JTextComponent; +import com.github.weisj.darklaf.theme.info.PresetIconRule; +import com.github.weisj.darklaf.theme.spec.ColorToneRule; +import org.checkerframework.checker.guieffect.qual.UI; import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.Configuration; import the.bytecode.club.bytecodeviewer.gui.components.SettingsDialog; @@ -134,11 +134,18 @@ public enum LAFTheme LafManager.install(new HighContrastLightTheme()); break; } - + //test theme installed correctly if(darkLAF) failSafe(); - + + if (!LafManager.isInstalled()) + { + setupIconColors(); + // Invalidate themed icons + IconLoader.updateThemeStatus(new Object()); + } + Configuration.showDarkLAFComponentIcons = darkLAF; if(BytecodeViewer.viewer != null) @@ -157,7 +164,7 @@ public enum LAFTheme SettingsDialog.dialogs.forEach(Dialog::dispose); } } - + /** * Attempts to failsafe by forcing an error before the mainviewer is called. * It then defaults to the system theme @@ -184,4 +191,52 @@ public enum LAFTheme UIUpdater.registerComponent(comp); } } + + private void setupIconColors() + { + Properties properties = new Properties(); + JTextComponent colorTemplateComponent = new JTextField(); + properties.put("textForeground", colorTemplateComponent.getForeground()); + colorTemplateComponent.setEnabled(false); + properties.put("textForegroundInactive", colorTemplateComponent.getForeground()); + properties.put("textSelectionForeground", colorTemplateComponent.getSelectedTextColor()); + + new LightIconThemeSupplier().loadIconTheme(properties, UIManager.getDefaults(), IconLoader.get()); + + UIManager.getLookAndFeelDefaults().putAll(properties); + } + + private static class LightIconThemeSupplier extends Theme + { + + @Override + protected PresetIconRule getPresetIconRule() + { + return PresetIconRule.LIGHT; + } + + @Override + public String getPrefix() + { + return "DO NOT USE"; + } + + @Override + public String getName() + { + return getPrefix(); + } + + @Override + protected Class getLoaderClass() + { + return LightIconThemeSupplier.class; + } + + @Override + public ColorToneRule getColorToneRule() + { + return ColorToneRule.LIGHT; + } + } } From 152948d840d2aa58bd77166ba4dafb503a1b8ae2 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 25 Apr 2022 23:47:36 +0200 Subject: [PATCH 8/9] Add small demo application to view icons --- .../club/bytecodeviewer/IconDemo.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/test/java/the/bytecode/club/bytecodeviewer/IconDemo.java diff --git a/src/test/java/the/bytecode/club/bytecodeviewer/IconDemo.java b/src/test/java/the/bytecode/club/bytecodeviewer/IconDemo.java new file mode 100644 index 00000000..018d4e04 --- /dev/null +++ b/src/test/java/the/bytecode/club/bytecodeviewer/IconDemo.java @@ -0,0 +1,103 @@ +package the.bytecode.club.bytecodeviewer; + +import com.github.weisj.darklaf.LafManager; +import com.github.weisj.darklaf.properties.icons.*; +import the.bytecode.club.bytecodeviewer.gui.theme.LAFTheme; +import the.bytecode.club.bytecodeviewer.resources.IconResources; +import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJRadioButtonMenuItem; + +import javax.swing.*; +import java.awt.*; + +public class IconDemo +{ + + public static void main(String[] args) + { + SwingUtilities.invokeLater(() -> { + switchToLaf(LAFTheme.SYSTEM); + JFrame frame = new JFrame("Icon Demo"); + JMenuBar menuBar = new JMenuBar(); + frame.setJMenuBar(menuBar); + + JMenu menu = menuBar.add(new JMenu("Theme")); + ButtonGroup lafGroup = new ButtonGroup(); + for (LAFTheme theme : LAFTheme.values()) + { + JRadioButtonMenuItem item = new TranslatedJRadioButtonMenuItem(theme.getReadableName(), theme.getTranslation()); + if (LAFTheme.SYSTEM.equals(theme)) + item.setSelected(true); + lafGroup.add(item); + item.addActionListener(e -> switchToLaf(theme)); + menu.add(item); + } + + IconEntry[] iconEntries = new IconEntry[] { + new IconEntry("Next", IconResources.nextIcon), + new IconEntry("Previous", IconResources.prevIcon), + new IconEntry("Busy", IconResources.busyIcon), + new IconEntry(".bat", IconResources.batIcon), + new IconEntry(".sh", IconResources.shIcon), + new IconEntry(".cs", IconResources.csharpIcon), + new IconEntry(".cpp", IconResources.cplusplusIcon), + new IconEntry(".Config", IconResources.configIcon), + new IconEntry(".jar", IconResources.jarIcon), + new IconEntry(".zip", IconResources.zipIcon), + new IconEntry("Package", IconResources.packagesIcon), + new IconEntry("Folder", IconResources.folderIcon), + new IconEntry("Android", IconResources.androidIcon), + new IconEntry("Unknown File", IconResources.unknownFileIcon), + new IconEntry("Text", IconResources.textIcon), + new IconEntry(".class", IconResources.classIcon), + new IconEntry("Image", IconResources.imageIcon), + new IconEntry("Decoded", IconResources.decodedIcon), + new IconEntry(".java", IconResources.javaIcon), + }; + JList iconList = new JList<>(iconEntries); + iconList.setCellRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) + { + super.getListCellRendererComponent(list, ((IconEntry) value).name, index, isSelected, cellHasFocus); + setIcon(((IconEntry) value).icon); + return this; + } + }); + JComponent content = new JScrollPane(iconList); + content.setPreferredSize(new Dimension(200, 400)); + frame.setContentPane(content); + frame.pack(); + + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + } + + private static void switchToLaf(LAFTheme theme) + { + try + { + theme.setLAF(); + LafManager.updateLaf(); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + private static class IconEntry + { + private static final int DISPLAY_SIZE = 50; + + private final String name; + private final Icon icon; + + private IconEntry(String name, Icon icon) + { + this.name = name; + this.icon = IconLoader.createDerivedIcon(icon, DISPLAY_SIZE, DISPLAY_SIZE); + } + } +} From 3524047c90b57f4eca007560ba3afba09ee89022 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Tue, 26 Apr 2022 22:45:51 +0200 Subject: [PATCH 9/9] Add icons for add/remove --- .../bytecodeviewer/gui/resourcelist/ResourceListPane.java | 5 +++-- .../club/bytecodeviewer/resources/IconResources.java | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListPane.java b/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListPane.java index 3dfd995d..5a1dacb8 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListPane.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/gui/resourcelist/ResourceListPane.java @@ -26,6 +26,7 @@ import org.apache.commons.io.FilenameUtils; import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.decompilers.Decompiler; import the.bytecode.club.bytecodeviewer.gui.contextmenu.ContextMenu; +import the.bytecode.club.bytecodeviewer.resources.IconResources; import the.bytecode.club.bytecodeviewer.resources.ResourceContainer; import the.bytecode.club.bytecodeviewer.resources.importing.Import; import the.bytecode.club.bytecodeviewer.translation.TranslatedComponents; @@ -72,8 +73,8 @@ public class ResourceListPane extends TranslatedVisibleComponent implements File public final JPopupMenu rightClickMenu = new JPopupMenu(); public final JCheckBox exact = new TranslatedJCheckBox("Exact path", TranslatedComponents.EXACT_PATH); public final JCheckBox caseSensitive = new TranslatedJCheckBox("Match case", TranslatedComponents.MATCH_CASE); - public final JButton open = new JButton("+"); - public final JButton close = new JButton("-"); + public final JButton open = new JButton(IconResources.add); + public final JButton close = new JButton(IconResources.remove); public final ResourceTreeNode treeRoot = new ResourceTreeNode("Loaded Files:"); public final ResourceTree tree = new ResourceTree(treeRoot); public final JTextField quickSearch = new TranslatedJTextField("Quick file search (no file extension)", TranslatedComponents.QUICK_FILE_SEARCH_NO_FILE_EXTENSION); diff --git a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java index 60ce7c76..b17d6484 100644 --- a/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java +++ b/src/main/java/the/bytecode/club/bytecodeviewer/resources/IconResources.java @@ -44,6 +44,8 @@ public class IconResources public static final List iconList; public static final BufferedImage icon; + public static final Icon add; + public static final Icon remove; public static final Icon nextIcon; public static final Icon prevIcon; public static final Icon busyIcon; @@ -68,6 +70,8 @@ public class IconResources { IconResolver iconResolver = IconLoader.get(); icon = loadImageFromResource("gui/bcv_icon.png"); + add = AllIcons.Action.Add.get(); + remove = AllIcons.Action.Remove.get(); nextIcon = iconResolver.getIcon("gui/next.svg", true); prevIcon = iconResolver.getIcon("gui/previous.svg", true); busyIcon = AllIcons.Misc.Progress.get();